用 P4114 的代码稍微改了一下,结果 TLE 了,多测也清空了,应该不会是 memset 的问题吧
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+1,M=2e4;
int tot,head[N],nxt[M];
int n,a[N],to[M],val[M];
void add(int x,int y,int z) {
to[tot]=y,val[tot]=z;
nxt[tot]=head[x];
head[x]=tot++;
}
int size[N],fa[N],depth[N];
int cnt,id[N],son[N],top[N];
struct SGT
{
int val[N<<2];
#define mid (l+r>>1)
#define pushup val[rt]=max(val[rt<<1],val[rt<<1|1])
void update(int rt,int l,int r,int p,int x)
{
if (l==r) return val[rt]=x,void();
if (p<=mid) update(rt<<1,l,mid,p,x);
else update(rt<<1|1,mid+1,r,p,x);
pushup;
}
void query(int rt,int l,int r,int L,int R,int &ans)
{
if (L<=l&&r<=R) return ans=max(ans,val[rt]),void();
if (L<=mid) query(rt<<1,l,mid,L,R,ans);
if (mid<R) query(rt<<1|1,mid+1,r,L,R,ans);
}
}A;
int read() {
int x=0; char ch=0;
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch&15),ch=getchar();
return x;
}
void dfs1(int u,int f)
{
fa[u]=f,size[u]=1;
depth[u]=depth[f]+1;
for (int i=head[u];~i;i=nxt[i])
if (to[i]!=f) {
dfs1(to[i],u),a[to[i]]=val[i],size[u]+=size[to[i]];
if (size[to[i]]>size[son[u]]) son[u]=to[i];
}
}
void dfs2(int u,int topf)
{
top[u]=topf,id[u]=(++cnt);
A.update(1,1,n,cnt,a[u]);
if (son[u]) dfs2(son[u],topf);
for (int i=head[u];~i;i=nxt[i])
if (!top[to[i]])
dfs2(to[i],to[i]);
}
int Query(int x,int y)
{
int ans=0;
if (x==y) return 0;
while (top[x]!=top[y]) {
if (depth[top[x]]<depth[top[y]]) swap(x,y);
A.query(1,1,n,id[top[x]],id[x],ans),x=fa[top[x]];
}
if (depth[x]>depth[y]) swap(x,y);
A.query(1,1,n,id[x]+1,id[y],ans);
return ans;
}
int main()
{
string s;
int T=read(),x,y,z;
while (T--) {
n=read(),cnt=tot=0;
memset(head,-1,sizeof head);
memset(son,0,sizeof son);
memset(top,0,sizeof top);
for (int i=1;i<n;i++) {
x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
} dfs1(1,0),dfs2(1,1);
while (cin>>s,s!="DONE")
{
x=read(),y=read();
if (s=="CHANGE") {
int tx=to[(x<<1)-1],ty=to[(x-1)<<1];
if (depth[tx]<depth[ty]) swap(tx,ty);
A.update(1,1,n,id[tx],y);
} else printf("%d\n",Query(x,y));
}
}
return 0;
}