POJ-3237(树链剖分+线段树)
来源:互联网 发布:套定额软件 编辑:程序博客网 时间:2024/05/17 07:02
题解:更改把路径上的边值都变为负值一看就是树链剖分,接着我们用点连着深度比较深的边的值设为边的值那么我们查询的时候当到达最近公共祖先的时候最近公共祖先的点的编号注意加一,接着就是线段树的更新用1和0表示区间变为负数或者不变为负数即可,最后要记录一下边队应的编号即可
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;#define ls 2*rt#define rs 2*rt+1#define mid (L+R)/2#define lson ls,L,mid#define rson rs,mid+1,R#define root 1,1,ntypedef long long int ll;const int mx = 1e4+5;struct node{ int v; int pos; int next;}e[mx<<2];int head[mx];int top[mx];int val[mx];int siz[mx];int son[mx];int pos[mx];int w[mx];int fa[mx];int id[mx];int dep[mx];int lazy[mx<<2];int Max[mx<<2];int Min[mx<<2];int n,m;int tot;int dfn;void init(){ tot = 0; dfn = 0; memset(head,0,sizeof(head));}void push_down(int rt){ if(lazy[rt]){ lazy[ls] = !lazy[ls]; lazy[rs] = !lazy[rs]; Max[ls] *= -1; Max[rs] *= -1; Min[ls] *= -1; Min[rs] *= -1; swap(Max[ls],Min[ls]); swap(Max[rs],Min[rs]); lazy[rt] = 0; }}void push_up(int rt){ Max[rt] = max(Max[rs],Max[ls]); Min[rt] = min(Min[rs],Min[ls]);}void built(int rt,int L,int R){ lazy[rt] = 0; if(L==R){ Max[rt] = Min[rt] = w[L]; return; } built(lson); built(rson); push_up(rt);}void update(int rt,int L,int R,int p,int v){ if(L==R){ Max[rt] = Min[rt] = v; return; } push_down(rt); if(p>mid) update(rson,p,v); else update(lson,p,v); push_up(rt);}void add(int u,int v,int pos){ tot++; e[tot].pos = pos; e[tot].v = v; e[tot].next = head[u]; head[u] = tot;}ll query(int rt,int L,int R,int l,int r){ if(L>=l&&R<=r) return Max[rt]; push_down(rt); if(l>mid) return query(rson,l,r); else if(r<=mid) return query(lson,l,r); else return max(query(lson,l,mid),query(rson,mid+1,r));}ll solve(int a,int b){ ll sum = -0x3f3f3f3f; while(top[a]!=top[b]){ if(dep[top[a]]<dep[top[b]]) swap(a,b); sum = max(sum,query(1,1,n,id[top[a]],id[a])); a = fa[top[a]]; } if(id[a]>id[b])swap(a,b); if(id[a]!=id[b]) sum = max(sum,query(1,1,n,id[a]+1,id[b])); return sum;}void Nag(int rt,int L,int R,int l,int r){ if(L>=l&&R<=r){ Max[rt] *= -1; Min[rt] *= -1; swap(Max[rt],Min[rt]); lazy[rt] = !lazy[rt]; return; } push_down(rt); if(l>mid) Nag(rson,l,r); else if(r<=mid) Nag(lson,l,r); else Nag(lson,l,mid),Nag(rson,mid+1,r); push_up(rt);}void nag(int a,int b){ while(top[a]!=top[b]){ if(dep[top[a]]<dep[top[b]]) swap(a,b); Nag(root,id[top[a]],id[a]); a = fa[top[a]]; } if(id[a]>id[b])swap(a,b); if(id[a]!=id[b]) Nag(root,id[a]+1,id[b]);}void dfs(int u,int pre,int d){ son[u] = 0; siz[u] = 1; fa[u] = pre; dep[u] = d; for(int i = head[u]; i; i = e[i].next){ int v = e[i].v; if(v!=pre){ pos[e[i].pos] = v; w[v] = val[e[i].pos]; dfs(v,u,d+1); siz[u] += siz[v]; if(siz[son[u]]<siz[v]) son[u] = v; } }}void DFS(int u,int tp){ top[u] = tp; id[u] = ++dfn; update(root,dfn,w[u]); if(son[u]!=0) DFS(son[u],tp); for(int i = head[u]; i; i = e[i].next){ int v = e[i].v; if(v!=fa[u]&&v!=son[u]) DFS(v,v); }}int main(){ int t; scanf("%d",&t); // freopen("out.txt","w",stdout); while(t--){ scanf("%d",&n); init(); for(int i = 2; i <= n; i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); val[i-1] = w; add(u,v,i-1); add(v,u,i-1); } dfs(1,1,1); built(root); DFS(1,1); while(1){ char ca[10]; scanf("%s",ca); if(ca[0]=='D') break; int a,b; scanf("%d%d",&a,&b); if(ca[0]=='C'){ int v = pos[a]; update(1,1,n,id[v],b); } else if(ca[0]=='Q') printf("%I64d\n",solve(a,b)); else nag(a,b); } } return 0;}
阅读全文
0 0
- POJ 3237 Tree(树链剖分+线段树)
- POJ 3237 Tree (树链剖分+线段树)
- POJ 3237 Tree(树链剖分+线段树)
- POJ 3237 Tree (树链剖分+线段树)
- POJ-3237(树链剖分+线段树)
- poj 3237(树链剖分+线段树)
- poj 3237 线段树+树链剖分
- poj 3237 树链剖分+线段树
- POJ 3237 树链剖分+线段树
- poj 3237 树链剖分模板(用到线段树lazy操作)
- POJ 3237 Tree(树链剖分 线段树区间标记)
- POJ 3237 Tree (树链剖分+线段树)
- |poj 3237|树链剖分|线段树|Tree
- poj 3237 Tree 树链剖分 线段树
- poj 2777(线段树)
- poj 2777(线段树)
- poj 3264 ( 线段树)
- poj~2828(线段树)
- ML初体验
- 微农链的数字身份技术
- zookeeper Leader选举 关于集群服务器为奇数的理解(转载的暂时还没看懂.....)
- 正则表达式必知必会学习笔记
- IjkPlayer简要学习及应用
- POJ-3237(树链剖分+线段树)
- 删除指定字符
- 关于Activity和Fragment生命周期关系
- 2017年浙江工业大学大学生程序设计迎新赛决赛 F-栗酱的不等式 [KMP]
- 2017-12-23
- 《spring cloud微服务实战》读书笔记——Spring Cloud Hystrix(四)使用详解(一)
- 利用McAfee策略让入侵者无法创建用户+无法删除用户+无法改密码的设 置方法
- JS函数式编程指南笔记1-4章
- Spring set注入与autowire