一个地方wa了3发,找了一组数组发现的错误,太蠢,就是两个人数作交换写成了 a=b ,b=a。最近智商真是感人。这道题是由spoj375这题改编的,多了一个取反的操作,这个操作只需要多维护一个最小值就行了。然后就是简单的树链剖分+线段树的区间操作。没什么好说的,直接上代码(过几天把LCT学习了,可能回头再来补这题)。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <map>
#define LL long long
#define FOR(i,x,y)  for(int i = x;i < y;i ++)
#define IFOR(i,x,y) for(int i = x;i > y;i --)
#define lrt rt<<1
#define rrt rt<<1|1
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define INF 0x3fffffff
#define MAXN 110000using namespace std;int n;int val0[MAXN],val[MAXN];int edge_cnt,head[MAXN];struct Edge{int u,v,idd;int nt;
}edge[MAXN<<1];void add_edge(int u,int v,int idd){edge[edge_cnt].u = u;edge[edge_cnt].v = v;edge[edge_cnt].idd = idd;edge[edge_cnt].nt = head[u];head[u] = edge_cnt ++;
}int top[MAXN],sz[MAXN],fa[MAXN],w[MAXN],son[MAXN],dep[MAXN],id[MAXN];
int totw;
map <int,int> mat;void dfs1(int u,int father,int depth){sz[u] = 1; fa[u] = father; dep[u] = depth;int idd = -1,maxx = -1;for(int i = head[u];i != -1;i = edge[i].nt){int v = edge[i].v;if(v == father) continue;id[v] = edge[i].idd;dfs1(v,u,depth+1);sz[u] += sz[v];if(sz[v] > maxx){maxx = sz[v]; idd = v;}}son[u] = idd;
}void dfs2(int u,int father){if(son[u] == -1)    return;top[son[u]] = top[u];w[son[u]] = ++totw;val[totw] = val0[id[son[u]]];mat[id[son[u]]] = totw;dfs2(son[u],u);for(int i = head[u];i != -1;i = edge[i].nt){int v = edge[i].v;if(v == father) continue;if(v == son[u]) continue;top[v] = v;w[v] = ++totw;val[totw] = val0[id[v]];mat[id[v]] = totw;dfs2(v,u);}
}struct Tree{int l,r;int maxx,minx;int lazy;
}tree[MAXN<<2];void UpDate_Flip(int rt){tree[rt].lazy ^= 1;int tem = tree[rt].maxx;tree[rt].maxx = -tree[rt].minx;tree[rt].minx = -tem;
}void PushDown(int rt){if(tree[rt].lazy){UpDate_Flip(lrt);UpDate_Flip(rrt);tree[rt].lazy = 0;}
}void PushUp(int rt){tree[rt].minx = min(tree[lrt].minx,tree[rrt].minx);tree[rt].maxx = max(tree[lrt].maxx,tree[rrt].maxx);
}void Build(int rt,int l,int r){tree[rt].l = l; tree[rt].r = r;tree[rt].lazy = 0;if(l == r){tree[rt].maxx = tree[rt].minx = val[l];return;}int mid = (l+r)>>1;Build(lson);Build(rson);PushUp(rt);
}void Modify(int rt,int x,int value){if(tree[rt].l == tree[rt].r){tree[rt].maxx = tree[rt].minx = value;return;}PushDown(rt);int mid = (tree[rt].l + tree[rt].r)>>1;if(x <= mid)    Modify(lrt,x,value);else Modify(rrt,x,value);PushUp(rt);
}void Negate(int rt,int l,int r){if(tree[rt].l == l && tree[rt].r == r){UpDate_Flip(rt);return;}PushDown(rt);int mid = (tree[rt].l + tree[rt].r)>>1;if(r <= mid)    Negate(lrt,l,r);else if(l > mid)    Negate(rrt,l,r);else{Negate(lson);Negate(rson);}PushUp(rt);
}int Query(int rt,int l,int r){if(tree[rt].l == l && tree[rt].r == r){return tree[rt].maxx;}PushDown(rt);int mid = (tree[rt].l + tree[rt].r)>>1;if(r <= mid)    return Query(lrt,l,r);else if(l > mid)    return Query(rrt,l,r);else{return max(Query(lson),Query(rson));}
}void C_Negate(int l,int r){while(top[l] != top[r]){if(dep[top[l]] >= dep[top[r]]){Negate(1,w[top[l]],w[l]);l = fa[top[l]];}else{Negate(1,w[top[r]],w[r]);r = fa[top[r]];}}if(l == r)  return;if(dep[l] >= dep[r]){Negate(1,w[r]+1,w[l]);}else Negate(1,w[l]+1,w[r]);
}int C_Query(int l,int r){int ans = -INF;while(top[l] != top[r]){if(dep[top[l]] >= dep[top[r]]){ans = max(ans,Query(1,w[top[l]],w[l]));l = fa[top[l]];}else{ans = max(ans,Query(1,w[top[r]],w[r]));r = fa[top[r]];}}if(l == r)  return  ans;if(dep[l] >= dep[r]){return max(ans,Query(1,w[r]+1,w[l]));}elsereturn max(ans,Query(1,w[l]+1,w[r]));
}int main()
{//freopen("test.in","r",stdin);int T;scanf("%d",&T);while(T--){scanf("%d",&n);edge_cnt = 0;memset(head,-1,sizeof(head));int u,v,value;FOR(i,1,n){scanf("%d%d%d",&u,&v,&value);val0[i] = value;add_edge(u,v,i);add_edge(v,u,i);}dfs1(1,-1,1);totw = 0;top[1] = 1;dfs2(1,-1);Build(1,1,totw);char op[10];while(~scanf("%s",op) && strcmp(op,"DONE")){if(!strcmp(op,"QUERY")){int l,r;scanf("%d%d",&l,&r);printf("%d\n",C_Query(l,r));}else if(!strcmp(op,"CHANGE")){int x,value;scanf("%d%d",&x,&value);Modify(1,mat[x],value);}else{int l,r;scanf("%d%d",&l,&r);C_Negate(l,r);}}}return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/hqwhqwhq/p/4811884.html

POJ 3237 树链剖分学习(树链剖分小结)相关推荐

  1. HDU 3966 POJ 3237 HYSBZ 2243 HRBUST 2064 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  2. 通过python构建一个区块链来学习区块链

    了解区块链Blockchains如何工作的最快方法就是构建一个区块链.你来到这里是因为,和我一样,你对加密钱币的崛起感到很兴奋.而且你想知道区块链是如何工作的,想了解它们背后的基本技术. 但理解区块链 ...

  3. 如何使用区块链币收款地址找合约地址?_区块链技术学习指引

    本文原文链接 本文为博客文章索引,小白必看.有新文章时会更新本文,建议大家加入收藏夹中,如果你觉得本站不错,欢迎你转发给朋友. 引言 给迷失在如何学习区块链技术的同学一个指引,区块链技术是随比特币诞生 ...

  4. 学习区块链要掌握哪些专项能力?区块链学习培训多长时间?

    2017年在北京举办的"一带一路"国际合作高峰论坛,沿线的20国青年评选出了他们心目中中国的"新四大发明":高铁.支付宝.共享单车和网购.而在这"新四 ...

  5. 区块链是什么?区块链能做什么?区块链学习路线分享

    2017年区块链在某些领域的应用已经相当成熟,比特币(加密数字货币),以太坊(区块链开发平台),超级账本(面向企业的分布式账本平台).也有一些处在起步阶段的应用(智能合约,证券.资产管理,公证防伪,知 ...

  6. POJ 3237 Tree (树链剖分)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 2825   Accepted: 769 Description ...

  7. POJ 3237 Tree (树链剖分 路径剖分 线段树的lazy标记)

    题目链接:http://poj.org/problem?id=3237 一棵有边权的树,有3种操作. 树链剖分+线段树lazy标记.lazy为0表示没更新区间或者区间更新了2的倍数次,1表示为更新,每 ...

  8. SPOJ 375 树链剖分学习

    学习树链剖分的第一题,第二个dfs忘记递归了(太蠢),re了两发,改过来以后就1A了. 学习树链剖分可以参考这篇博客:http://blog.sina.com.cn/s/blog_7a17468201 ...

  9. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

最新文章

  1. jqgrid如何渲染表格数据_jqgrid,jquery_jqGrid pivot 增加分项小计,jqgrid,jquery,jquery插件,javascript,表格 - phpStudy...
  2. 安卓x86程序安装目录_电脑上的安卓系统体验
  3. elasticsearch virtual memory虚拟内存配置“max virtual memory areas vm.max_map_count [65530] is too low, inc
  4. Bootstrap的栅格布局
  5. 关于 Unloading class sun.reflect.GeneratedSerial...
  6. 在Linux下禁用IPv6的方法小结
  7. JAVA 蔡羽 基础知识漫谈
  8. 百度网盘提取码_百度网盘提取码查询神器分享
  9. RESTClient 使用,一个小巧方便的插件
  10. 历史 微信开发者工具_微信开发者工具
  11. 单片机常用芯片总结(二)——DS1302时钟芯片
  12. 什么编程语言的开发者平均年薪高达94万?
  13. shiro的anon失效问题
  14. 【Java获取国家法定节假日三种工具类其一】
  15. 欢迎中文社区新版主@黄念刚
  16. Pyhton零基础投喂(综合练习:1.论⽂数据统计)
  17. 计算机与linux基础
  18. like to do 和like doing的区别
  19. 基于艾宾浩斯遗忘曲线的APP(大学毕业设计)
  20. deepin连接企业加密wifi

热门文章

  1. route map应用策略路由(下)
  2. [导入]Ms Ajax Lib- Object 类型扩展
  3. Schema initialization FAILED! Metastore state would be inconsistent !!
  4. sql中进行计算并重命名
  5. Armijo-Goldstein和wolfe-power的matlab代码实现(转)
  6. 螺丝上的十字磨没了_十字起子和无限下拉菜单
  7. (原創) 如何讀取/寫入文字檔? (IC Design) (Verilog)
  8. 课后作业之字符串加密
  9. Mybatis基于XML配置SQL映射器(二)
  10. java自动猜测文件编码