传送门

这该死的码农题……

把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了

这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然后再取反

单点修改的时候忘记pushdown结果调了好久……

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define inf 0x3f3f3f3f
  4. using namespace std;
  5. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
  6. template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
  7. inline int read(){
  8. #define num ch-'0'
  9. char ch;bool flag=;int res;
  10. while(!isdigit(ch=getchar()))
  11. (ch=='-')&&(flag=true);
  12. for(res=num;isdigit(ch=getchar());res=res*+num);
  13. (flag)&&(res=-res);
  14. #undef num
  15. return res;
  16. }
  17. char sr[<<],z[];int K=-,Z;
  18. inline void Ot(){fwrite(sr,,K+,stdout),K=-;}
  19. inline void print(int x){
  20. if(K><<)Ot();if(x<)sr[++K]=,x=-x;
  21. while(z[++Z]=x%+,x/=);
  22. while(sr[++K]=z[Z],--Z);sr[++K]='\n';
  23. }
  24. const int N=;
  25. int head[N],Next[N<<],ver[N<<],edge[N<<],tot=;
  26. inline void add(int u,int v,int e){
  27. ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
  28. }
  29. int dfn[N],top[N],sz[N],son[N],num[N],val[N],dep[N],fa[N],cnt,n,m;
  30. void dfs1(int u){
  31. sz[u]=,dep[u]=dep[fa[u]]+;
  32. for(int i=head[u];i;i=Next[i]){
  33. int v=ver[i];
  34. if(v!=fa[u]){
  35. fa[v]=u,num[i>>]=v,dfs1(v),sz[u]+=sz[v];
  36. if(sz[son[u]]<sz[v]) son[u]=v;
  37. }
  38. }
  39. }
  40. void dfs2(int u,int t){
  41. top[u]=t,dfn[u]=++cnt;
  42. if(son[u]){
  43. dfs2(son[u],t);
  44. for(int i=head[u];i;i=Next[i])
  45. if(ver[i]!=fa[u]&&ver[i]!=son[u])
  46. dfs2(ver[i],ver[i]);
  47. }
  48. }
  49. int mx[N<<],mn[N<<],sum[N<<],rev[N<<];
  50. #define ls (p<<1)
  51. #define rs (p<<1|1)
  52. inline void upd(int p){
  53. mx[p]=max(mx[ls],mx[rs]),mn[p]=min(mn[ls],mn[rs]),sum[p]=sum[ls]+sum[rs];
  54. }
  55. inline void ppd(int p){
  56. rev[p]^=,sum[p]=-sum[p],swap(mn[p],mx[p]),mn[p]=-mn[p],mx[p]=-mx[p];
  57. }
  58. inline void pd(int p){
  59. if(rev[p]){
  60. ppd(ls),ppd(rs);
  61. rev[p]=;
  62. }
  63. }
  64. void build(int p,int l,int r){
  65. if(l==r) return (void)(mx[p]=mn[p]=sum[p]=val[l]);
  66. int mid=(l+r)>>;
  67. build(ls,l,mid),build(rs,mid+,r);
  68. upd(p);
  69. }
  70. void update(int p,int l,int r,int x){
  71. if(l==r) return (void)(mn[p]=mx[p]=sum[p]=val[l]);
  72. int mid=(l+r)>>;pd(p);
  73. x<=mid?update(ls,l,mid,x):update(rs,mid+,r,x);
  74. upd(p);
  75. }
  76. void Rev(int p,int l,int r,int ql,int qr){
  77. if(ql<=l&&qr>=r) return (void)(ppd(p));
  78. int mid=(l+r)>>;pd(p);
  79. if(ql<=mid) Rev(ls,l,mid,ql,qr);
  80. if(qr>mid) Rev(rs,mid+,r,ql,qr);
  81. upd(p);
  82. }
  83. int querysum(int p,int l,int r,int ql,int qr){
  84. if(ql<=l&&qr>=r) return sum[p];
  85. int mid=(l+r)>>,res=;pd(p);
  86. if(ql<=mid) res+=querysum(ls,l,mid,ql,qr);
  87. if(qr>mid) res+=querysum(rs,mid+,r,ql,qr);
  88. return res;
  89. }
  90. int querymax(int p,int l,int r,int ql,int qr){
  91. if(ql<=l&&qr>=r) return mx[p];
  92. int mid=(l+r)>>,res=-inf;pd(p);
  93. if(ql<=mid) cmax(res,querymax(ls,l,mid,ql,qr));
  94. if(qr>mid) cmax(res,querymax(rs,mid+,r,ql,qr));
  95. return res;
  96. }
  97. int querymin(int p,int l,int r,int ql,int qr){
  98. if(ql<=l&&qr>=r) return mn[p];
  99. int mid=(l+r)>>,res=inf;pd(p);
  100. if(ql<=mid) cmin(res,querymin(ls,l,mid,ql,qr));
  101. if(qr>mid) cmin(res,querymin(rs,mid+,r,ql,qr));
  102. return res;
  103. }
  104. void change(int i,int x){
  105. val[dfn[num[i]]]=x,update(,,n,dfn[num[i]]);
  106. }
  107. void RRR(int u,int v){
  108. while(top[u]!=top[v]){
  109. if(dep[top[u]]<dep[top[v]]) swap(u,v);
  110. Rev(,,n,dfn[top[u]],dfn[u]);u=fa[top[u]];
  111. }
  112. if(u!=v){
  113. if(dep[u]<dep[v]) swap(u,v);
  114. Rev(,,n,dfn[son[v]],dfn[u]);
  115. }
  116. }
  117. int SUM(int u,int v){
  118. int res=;
  119. while(top[u]!=top[v]){
  120. if(dep[top[u]]<dep[top[v]]) swap(u,v);
  121. res+=querysum(,,n,dfn[top[u]],dfn[u]);u=fa[top[u]];
  122. }
  123. if(u!=v){
  124. if(dep[u]<dep[v]) swap(u,v);
  125. res+=querysum(,,n,dfn[son[v]],dfn[u]);
  126. }
  127. return res;
  128. }
  129. int MAX(int u,int v){
  130. int res=-inf;
  131. while(top[u]!=top[v]){
  132. if(dep[top[u]]<dep[top[v]]) swap(u,v);
  133. cmax(res,querymax(,,n,dfn[top[u]],dfn[u]));u=fa[top[u]];
  134. }
  135. if(u!=v){
  136. if(dep[u]<dep[v]) swap(u,v);
  137. cmax(res,querymax(,,n,dfn[son[v]],dfn[u]));
  138. }
  139. return res;
  140. }
  141. int MIN(int u,int v){
  142. int res=inf;
  143. while(top[u]!=top[v]){
  144. if(dep[top[u]]<dep[top[v]]) swap(u,v);
  145. cmin(res,querymin(,,n,dfn[top[u]],dfn[u]));u=fa[top[u]];
  146. }
  147. if(u!=v){
  148. if(dep[u]<dep[v]) swap(u,v);
  149. cmin(res,querymin(,,n,dfn[son[v]],dfn[u]));
  150. }
  151. return res;
  152. }
  153. char s[];
  154. int main(){
  155. // freopen("testdata.in","r",stdin);
  156. n=read();
  157. for(int i=,u,v,e;i<n;++i)
  158. u=read()+,v=read()+,e=read(),add(u,v,e),add(v,u,e);
  159. dfs1(),dfs2(,);
  160. for(int i=;i<n;++i) val[dfn[num[i]]]=edge[i<<];
  161. build(,,n);
  162. m=read();
  163. while(m--){
  164. scanf("%s",s+);int u=read()+,v=read()+;
  165. switch(s[]){
  166. case 'C':--u,--v,change(u,v);break;
  167. case 'N':RRR(u,v);break;
  168. case 'S':print(SUM(u,v));break;
  169. default:{
  170. print(s[]=='A'?MAX(u,v):MIN(u,v));
  171. break;
  172. }
  173. }
  174. }
  175. Ot();
  176. return ;
  177. }

洛谷P1505 [国家集训队]旅游(树剖+线段树)的更多相关文章

  1. 洛谷 P1505 [国家集训队]旅游 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...

  2. 洛谷 P1505 [国家集训队]旅游 解题报告

    P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游 ...

  3. 洛谷P1505 [国家集训队]旅游

    题目描述 \(Ray\) 乐忠于旅游,这次他来到了\(T\) 城.\(T\) 城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,\(T ...

  4. [洛谷]P1505 [国家集训队]旅游

    题目链接: 传送门 题目分析: 树剖板,支持单点修改,区间取反,区间求最大值/最小值/和 区间取反取两次等于没取,维护一个\(rev\ tag\),每次打标记用\(xor\)打,记录是否需要翻转,\( ...

  5. 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)

    旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...

  6. 洛谷 P1975 [国家集训队]排队 Lebal:块内排序+树状数组

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和. 红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  7. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  8. 洛谷P4315 月下“毛景树”(树剖+线段树)

    传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 ...

  9. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

随机推荐

  1. RESTful API设计规范收集

    说明:其实没有绝对的规范,达到90%即可. 理解RESTful架构:http://www.ruanyifeng.com/blog/2011/09/restful.html RESTful API 设计 ...

  2. git获取远程分支

    运行 git checkout -b local-branchname origin/remote_branchname  就可以将远程分支映射到本地命名为local-branchname  的一分支 ...

  3. Mysql不同存储引擎的表转换方法

    Mysql不同存储引擎的表转换方法 1.Alter table直接修改表的存储引擎,但是这样会导致大量的系统开销,Mysql为此要执行一个就表向新表的逐行复制.在此期间,转换操作可能会占用服务器的所有 ...

  4. VC++ VS2010 error LNK1123 转换到 COFF 期间失败 怎么办

    1 无法输出Hello world   2 点击项目-属性,打开属性页   3 配置属性-清单工具-输入和输出-嵌入清单改成否   4 找出计算机中的所有cvtres.exe,删掉早期的,只留最新版的 ...

  5. 使用vscode 编译 sass

    由于我在工作中用的编辑器是 vscode ,所以记录一下vscode 编译sass 的配置 vs code 编译saass 1.在扩展里搜索“easy sass”,直接进行安装即可 2.安装后默认已经 ...

  6. 当你使用LINQ做底层时,最好设计一个工厂,不要把LINQ的动作暴露给业务层

    1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: ...

  7. 欧莱雅浅谈OC中方法调用的顺序中的Category

    OC特有的分类Category,依赖于类.它可以在不改变原来的类内容的基础上,为类增加一些方法.分类的使用注意: (1)分类只能增加方法,不能增加成员变量: (2)在分类方法的实现中可以访问原来类中的 ...

  8. POJ 1927 Area in Triangle(计算几何)

    Area in Triangle 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40707691 题目大意: 给你一个三角形的三 ...

  9. chrome浏览器世界之窗浏览器的收藏夹在哪?

    今天心血来潮,用一个查重软件删除重复文件,结果把chrome浏览器和世界之窗浏览器的收藏夹给删除了,导致我保存的好多网页都没有了,在浏览器本身和网上都没有找到这两个浏览器默认的收藏夹在哪个位置,只好用 ...

  10. HBase使用教程

    1     基本介绍 1.1 前言 HBase – Hadoop Database.是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigta ...