CodeForces 191C 树链剖分 第4遍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 191C 树链剖分 第4遍相关的知识,希望对你有一定的参考价值。
非常无奈,模板重新无奈的打错了。。
只是,非常快便找到了。。
题意:给一些边,有一些操作,每次操作,都要在这些边上加上1,求每一个边的边权。。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define lson id << 1 #define rson id << 1|1 const int M = 100008; int top[M],siz[M],son[M],father[M],ti[M],dep[M]; int e[M][2],idx,tp; struct { int head; }H[M]; struct{ int v,next; }E[M*2]; void init(){ memset(H,-1,sizeof(H)); memset(E,-1,sizeof(E)); tp = 0,idx = 0; } void add(int u,int v){ E[tp].v =v; E[tp].next = H[u].head; H[u].head = tp++; } void dfs_1(int u,int fa){ son[u] = 0;siz[u] = 1;father[u] = fa;dep[u] = dep[fa] + 1; for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == fa)continue; dfs_1(v,u); siz[u] += siz[v]; if(siz[v] > siz[son[u]])son[u] = v; } } void dfs_2(int u,int fa){ ti[u] = idx++; top[u] = fa; if(son[u])dfs_2(son[u],fa); for(int i=H[u].head;i!=-1;i=E[i].next){ int v = E[i].v; if(v == father[u]|| v == son[u])continue; dfs_2(v,v); } } struct M_tree{ int mark,l,r; int mid(){ return (l+r) /2; } }node[M*4]; void build_tree(int id,int l,int r){ node[id].l = l;node[id].r = r;node[id].mark = 0; if(l == r)return; int mid = node[id].mid(); build_tree(lson,l,mid); build_tree(rson,mid+1,r); } void push_down(int id){ if(node[id].l == node[id].r)return; if(node[id].mark){ node[lson].mark += node[id].mark ; node[rson].mark += node[id].mark ; node[id].mark = 0; } } void nede(int id,int l,int r){ if(node[id].l == l&&node[id].r == r){ node[id].mark += 1; return; } push_down(id); int mid = node[id].mid(); if(r <=mid)nede(lson,l,r); else if(l > mid)nede(rson,l,r); else{ nede(lson,l,mid); nede(rson,mid+1,r); } } int ans = 0; int query(int id,int r){ if( node[id].l == r&&node[id].r == r)return node[id].mark; push_down(id); int mid= node[id].mid(); if(r <=mid)return query(lson,r); else return query(rson,r); } void negat(int u,int v){ int f1 = top[u]; int f2 = top[v]; while(f1 != f2){ if(dep[f1] < dep[f2]){ swap(f1,f2); swap(u,v); }//cout << ti[f1] << "<---->" << ti[u]<<endl; nede(1,ti[f1],ti[u]); u = father[f1];f1 = top[u]; } if(u == v)return; if(dep[u] > dep[v])swap(u,v); nede(1,ti[son[u]],ti[v]); } int main() { int u,v,n,m; while(~scanf("%d",&n)){ init(); for(int i=0;i<n-1;i++){ scanf("%d%d",&e[i][0],&e[i][1]); add(e[i][0],e[i][1]); add(e[i][1],e[i][0]); } dfs_1(1,1); dfs_2(1,1); build_tree(1,0,idx-1); //cout <<idx<<endl; scanf("%d",&m); while(m--){ scanf("%d%d",&u,&v); negat(u,v); } for(int i=0;i<n-1;i++) { if(dep[e[i][0]] > dep[e[i][1]]){ swap(e[i][0],e[i][1]); } } for(int i=0;i<n-1;i++){ printf("%d",query(1,ti[e[i][1]])); if(i!=n-2)printf(" "); } printf("\n"); } }
以上是关于CodeForces 191C 树链剖分 第4遍的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 343D water tree(树链剖分)
codeforces 343D Water Tree 树链剖分 dfs序 线段树 set
Codeforces Round #425 (Div. 2) D 树链剖分 + 树状数组维护区间
D. Happy Tree Party CodeForces 593D树链剖分,树边权转点权
Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状