CodeForces 191C 树链剖分 第4遍
来源:互联网 发布:a算法八数码 编辑:程序博客网 时间:2024/06/13 06:19
很无奈,模板又一次无奈的打错了。。不过,很快便找到了。。
题意:给一些边,有一些操作,每次操作,都要在这些边上加上1,求每个边的边权。。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define lson id << 1#define rson id << 1|1const 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"); }}
0 0
- CodeForces 191C 树链剖分 第4遍
- Hdu 3804 树链剖分 第5遍
- Codeforces 191 C Fools and Roads (树链剖分)
- Codeforces 191C Fools and Roads(树链剖分)
- zynq虐我千百遍——第4篇 Linaro之rootfs
- 第100遍学习正则表达式
- CodeForces 4C
- Codeforces 4C
- CodeForces - 4C
- codeforces 4-c
- 第二遍C++primer->C风格字符串
- codeforces 121 (比赛) codeforces 191C
- 废话连遍C++
- Linux下C语言历遍目录
- 今天晚上再用c 实现一遍
- 第二遍C++primer->关于关键字extern,
- 第二遍C++primer->const成员函数
- 第二遍C++primer->转换与继承
- Android相关权限的概念
- c++ sizeof
- Golang在Ubuntu 上使用Oracle数据库
- iOS 扩展机制category与associative
- SQL Server uses more memory than "max server memory"
- CodeForces 191C 树链剖分 第4遍
- codechef Chef and Rainbow Array - 2
- Android动画之Property Animation(四)
- 飘逸的python - __get__ vs __getattr__ vs __getattribute__以及属性的搜索策略
- Jaxb处理java对象和xml之间转换常用的annotation
- 运行vs编译出的exe文件
- <objc/runtime.h>中Associative机制(在button以及block传值)
- JDBC总结
- QtQuick桌面应用开发指导 3)实现UI和功能_B 4)动态管理Note对象_A