社区讨论
昨天一直在judgeing的我又来了
SP375QTREE - Query on a tree参与者 6已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi6y15yg
- 此快照首次捕获于
- 2025/11/20 12:40 4 个月前
- 此快照最后确认于
- 2025/11/20 12:40 4 个月前
这回变成TLE了
哪位dalao能帮我看一下这题的树剖QwQ
CPP#include<stdio.h>
int T,N,Fa[10005],Size[10005],Top[10005],bq[10005],Son[10005],id[10005],nbq[10005],Head[10005],Deep[10005],cnt=1,F[40005],ans;
char ch[10];
int maxx(int a,int b)
{
if(a>b)
return a;
return b;
}
struct lx
{
int b,c,next;
}Lx[20005];
void add(int u,int v,int w)
{
Lx[++cnt].b=v;
Lx[cnt].c=w;
Lx[cnt].next=Head[u];
Head[u]=cnt;
}
void dfs1(int fa,int now,int len)
{
Deep[now]=cnt;
int maxn=0;
Fa[now]=fa;
Size[now]=1;
bq[now]=len;
for(int i=Head[now],zj;i;i=Lx[i].next)
{
zj=Lx[i].b;
if(zj==Fa[now]) continue;
cnt++;
dfs1(now,zj,Lx[i].c);
cnt--;
Size[now]+=Size[zj];
if(Size[zj]>maxn)
{
Son[now]=zj;
maxn=Size[zj];
}
}
}
void dfs2(int top,int now)
{
id[now]=++cnt;
nbq[cnt]=bq[now];
Top[now]=top;
if(Son[now])
dfs2(top,Son[now]);
for(int i=Head[now],zj;i;i=Lx[i].next)
{
zj=Lx[i].b;
if(zj==Fa[now]||zj==Son[now]) continue;
dfs2(zj,zj);
}
}
void bu(int O,int l,int r)
{
if(l==r)
{
F[O]=nbq[l];
return ;
}
int mid=(l+r)/2;
bu(O*2,l,mid);
bu(O*2+1,mid+1,r);
F[O]=maxx(F[O*2],F[O*2+1]);
}
void up(int O,int l,int r,int id,int k)
{
if(l==id&&r==id)
{
F[O]=k;
return ;
}
int mid=(l+r)/2;
if(id<=mid)
up(O*2,l,mid,id,k);
else
up(O*2+1,mid+1,r,id,k);
F[O]=maxx(F[O*2],F[O*2+1]);
}
int qu(int O,int l,int r,int s,int t)
{
if(l==s&&r==t)
return F[O];
int mid=(l+r)/2;
if(t<=mid)
return qu(O*2,l,mid,s,t);
else if(s>mid)
return qu(O*2+1,mid+1,r,s,t);
else
return maxx(qu(O*2,l,mid,s,mid),qu(O*2+1,mid+1,r,mid+1,t));
}
int LCA(int a,int b)
{
int maxn=0;
while(Top[a]!=Top[b])
{
if(Deep[Top[a]]>Deep[Top[b]])
{
maxn=maxx(maxn,qu(1,1,N,id[Top[a]],id[a]));
a=Fa[Top[a]];
}
else
{
maxn=maxx(maxn,qu(1,1,N,id[Top[b]],id[b]));
b=Fa[Top[b]];
}
}
if(Deep[a]>Deep[b])
maxn=maxx(maxn,qu(1,1,N,id[Son[b]],id[a]));
else
maxn=maxx(maxn,qu(1,1,N,id[Son[a]],id[b]));
return maxn;
}
int main()
{
scanf("%d",&T);
while(T--)
{
for(int i=1;i<=10000;i++)
Deep[i]=Son[i]=Fa[i]=Size[i]=Top[i]=bq[i]=id[i]=nbq[i]=Head[i]=0;
for(int i=1;i<=20000;i++)
Lx[i].b=Lx[i].c=Lx[i].next=0;
for(int i=1;i<=40000;i++)
F[i]=0;
cnt=0;
scanf("%d",&N);
for(int i=1,a,b,c;i<=N-1;i++)
{
scanf("%d %d %d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
dfs1(1,1,0);
cnt=0;
dfs2(1,1);
bu(1,1,N);
while(scanf("%s",ch)&&ch[0]!='D')
{
if(ch[0]=='C')
{
int ti,ith,zj1,zj2;
scanf("%d %d",&ith,&ti);
zj1=Lx[ith*2-1].b;
zj2=Lx[ith*2].b;
if(Fa[zj1]==zj2)
up(1,1,N,id[zj1],ti);
else
up(1,1,N,id[zj2],ti);
}
if(ch[0]=='Q')
{
int a,b;
scanf("%d %d",&a,&b);
ans=LCA(a,b);
printf("%d\n",ans);
}
}
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...