http://acm.hdu.edu.cn/showproblem.php?pid=3804
居然在树剖题集里发现这道题 一开始智障的用树上主席树 MLE。。 不就是个普通dfs吗。。
开个vector把每个点的查询存起来 然后遍历到一个点时更新权值线段树 返回时反更新
深陷数据结构泥潭 要加快进度了
#include <bits/stdc++.h>
using namespace std;
struct node1
{
int u;
int v;
int w;
};
struct node2
{
int v;
int next;
};
struct node3
{
int id;
int y;
};
node1 pre[100010];
node2 edge[200010];
vector <node3> order[100010];
int cnt[400010],sum[400010];
int first[100010],val[100010],tmp[100010],deep[100010],ans[100010];
int n,q,num,len;
void addedge(int u,int v)
{
edge[num].v=v;
edge[num].next=first[u];
first[u]=num++;
}
void dfsI(int cur,int fa)
{
int i,v;
for(i=first[cur];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(v!=fa)
{
deep[v]=deep[cur]+1;
dfsI(v,cur);
}
}
}
void pushup(int cur)
{
sum[cur]=max(sum[2*cur],sum[2*cur+1]);
}
void update(int tar,int gou,int l,int r,int cur)
{
int m;
if(l==r)
{
cnt[cur]+=gou;
if(cnt[cur]>0) sum[cur]=tmp[tar];
else sum[cur]=-1;
return;
}
m=(l+r)/2;
if(tar<=m) update(tar,gou,l,m,2*cur);
else update(tar,gou,m+1,r,2*cur+1);
pushup(cur);
}
int query(int pl,int pr,int l,int r,int cur)
{
int res,m;
if(pl<=l&&r<=pr) return sum[cur];
res=-1,m=(l+r)/2;
if(pl<=m) res=max(res,query(pl,pr,l,m,2*cur));
if(pr>m) res=max(res,query(pl,pr,m+1,r,2*cur+1));
return res;
}
void dfsII(int cur,int fa)
{
int i,v,p;
p=lower_bound(tmp+1,tmp+len+1,val[cur])-tmp;
update(p,1,1,len,1);
for(i=0;i<order[cur].size();i++)
{
p=upper_bound(tmp+1,tmp+len+1,order[cur][i].y)-tmp-1;
ans[order[cur][i].id]=query(1,p,1,len,1);
}
for(i=first[cur];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(v!=fa)
{
dfsII(v,cur);
}
}
p=lower_bound(tmp+1,tmp+len+1,val[cur])-tmp;
update(p,-1,1,len,1);
}
int main()
{
node3 gou;
int t,i,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(first,-1,sizeof(first));
num=0;
for(i=1;i<=n-1;i++)
{
scanf("%d%d%d",&pre[i].u,&pre[i].v,&pre[i].w);
addedge(pre[i].u,pre[i].v);
addedge(pre[i].v,pre[i].u);
}
deep[1]=1;
dfsI(1,-1);
for(i=1;i<=n-1;i++)
{
if(deep[pre[i].u]<deep[pre[i].v]) swap(pre[i].u,pre[i].v);
val[pre[i].u]=pre[i].w;
}
val[1]=-1;
for(i=1;i<=n;i++) tmp[i]=val[i];
sort(tmp+1,tmp+n+1);
len=unique(tmp+1,tmp+n+1)-tmp-1;
for(i=1;i<=n;i++) order[i].clear();
scanf("%d",&q);
for(i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);
gou.id=i,gou.y=y;
order[x].push_back(gou);
}
memset(cnt,0,sizeof(cnt));
memset(sum,-1,sizeof(sum));
dfsII(1,-1);
for(i=1;i<=q;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}