BZOJ 3307: 雨天的尾巴
2017-03-31 11:41
441 查看
被虐地不要不要的 我还是太垃圾了
显然 我们可以在 x,y打个1的标记 在 lca(x,y) fa(lca(x,y))打一个-1的标记
然后我们就可以从下往上来进行线段树合并了
显然 我们可以在 x,y打个1的标记 在 lca(x,y) fa(lca(x,y))打一个-1的标记
然后我们就可以从下往上来进行线段树合并了
#include<bits/stdc++.h> using namespace std; const int N=100005; inline int read() { char ch=getchar(); int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();} return x*f; } struct node{int y,next;}a[N<<1]; int len,first ; void ins(int x,int y){a[++len]=(node){y,first[x]},first[x]=len;} int f [17],d[17],z ,zl,dep ,lx ,ly ,g ,ans ; inline void dfs1(int x) { for(int i=1;i<=16;i++) if(f[x][i-1])f[x][i]=f[f[x][i-1]][i-1]; else break; for(int k=first[x];k;k=a[k].next) { int y=a[k].y; if(y==f[x][0])continue; f[y][0]=x,dep[y]=dep[x]+1,dfs1(y); } } int lca(int x,int y) { if(dep[x]<dep[y])x^=y^=x^=y; for(int i=16;i>=0;i--)if(dep[x]-dep[y]>=d[i])x=f[x][i]; if(x==y)return x; for(int i=16;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i]; return f[x][0]; } int rt[N*45],lc[N*45],rc[N*45],c[N*45],p[N*45],tot; inline void up(int x) { if(c[lc[x]]<c[rc[x]]) c[x]=c[rc[x]],p[x]=p[rc[x]]; else c[x]=c[lc[x]],p[x]=p[lc[x]]; } inline void merge(int &u1,int u2,int l,int r) { if(!u2)return; if(!u1){u1=u2;return;} if(l==r){c[u1]+=c[u2],p[u1]=c[u1]?l:0; return;} int mid=(l+r)>>1; merge(lc[u1],lc[u2],l,mid),merge(rc[u1],rc[u2],mid+1,r); up(u1); } void add(int &x,int l,int r,int k,int u) { if(!x)x=++tot; if(l==r){c[x]+=u,p[x]=l; return;} int mid=(l+r)>>1; if(k<=mid)add(lc[x],l,mid,k,u); else add(rc[x],mid+1,r,k,u); up(x); } inline void dfs2(int x) { for(int k=first[x];k;k=a[k].next) { int y=a[k].y; if(y==f[x][0])continue; dfs2(y); merge(rt[x],rt[y],1,zl); } ans[x]=z[p[rt[x]]]; } int main() { int n=read(),m=read(),x,y,i; d[0]=1; for(i=1;i<=16;i++)d[i]=d[i-1]<<1; for(i=1;i<n;i++) x=read(),y=read(),ins(x,y),ins(y,x); dfs1(1); for(i=1;i<=m;i++) lx[i]=read(),ly[i]=read(),g[i]=z[i]=read(); sort(z+1,z+1+m); zl=unique(z+1,z+1+m)-z-1,tot=0; for(i=1;i<=m;i++) { x=lx[i],y=ly[i]; int u=lower_bound(z+1,z+1+zl,g[i])-z,l=lca(x,y); add(rt[x],1,zl,u,1),add(rt[y],1,zl,u,1); add(rt[l],1,zl,u,-1); if(f[l][0])add(rt[f[l][0]],1,zl,u,-1); } dfs2(1); for(i=1;i<=n;i++)printf("%d\n",ans[i]); return 0; }
相关文章推荐
- bzoj 3307: 雨天的尾巴 线段树
- bzoj 3307: 雨天的尾巴【树剖lca+树上差分+线段树合并】
- bzoj 3307: 雨天的尾巴 线段树合并
- BZOJ 3307 雨天的尾巴 树上差分+lca+权值线段树合并
- bzoj 3307 雨天的尾巴
- 【BZOJ 3307】 3307: 雨天的尾巴 (线段树+树链剖分)
- [bzoj3307]雨天的尾巴【线段树】
- BZOJ 3307 雨天的尾巴 线段树
- BZOJ3307 雨天的尾巴
- [bzoj3307]雨天的尾巴
- 【BZOJ3307】雨天的尾巴-线段树合并+树上差分
- bzoj 3307: 雨天的尾巴
- [bzoj3307]雨天的尾巴_线段树合并
- 【BZOJ3307】雨天的尾巴
- bzoj3307 雨天的尾巴
- [BZOJ]3307: 雨天的尾巴 线段树合并+树上差分
- BZOJ 3307: 雨天的尾巴( LCA + 线段树合并 )
- 【BZOJ3307】雨天的尾巴(权限题)
- 【bzoj3307】雨天的尾巴 权值线段树合并
- 【BZOJ3307】雨天的尾巴 线段树合并