Description

Ray 乐忠于旅游,这次他来到了T 城。T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接。为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径。换句话说, T 城中只有N − 1 座桥。Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁。于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座桥会增加w 的愉悦度,这或许是正的也可能是负的。有时,Ray 看待同一座桥的心情也会发生改变。现在,Ray 想让你帮他计算从u 景点到v 景点能获得的总愉悦度。有时,他还想知道某段路上最美丽的桥所提供的最大愉悦度,或是某段路上最糟糕的一座桥提供的最低愉悦度。

Input

输入的第一行包含一个整数N,表示T 城中的景点个数。景点编号为 0…N − 1。接下来N − 1 行,每行三个整数u、v 和w,表示有一条u 到v,使 Ray 愉悦度增加w 的桥。桥的编号为1…N − 1。|w| <= 1000。输入的第N + 1 行包含一个整数M,表示Ray 的操作数目。接下来有M 行,每行描述了一个操作,操作有如下五种形式: C i w,表示Ray 对于经过第i 座桥的愉悦度变成了w。 N u v,表示Ray 对于经过景点u 到v 的路径上的每一座桥的愉悦度都变成原来的相反数。 SUM u v,表示询问从景点u 到v 所获得的总愉悦度。 MAX u v,表示询问从景点u 到v 的路径上的所有桥中某一座桥所提供的最大愉悦度。 MIN u v,表示询问从景点u 到v 的路径上的所有桥中某一座桥所提供的最小愉悦度。测试数据保证,任意时刻,Ray 对于经过每一座桥的愉悦度的绝对值小于等于1000。

Output

对于每一个询问(操作S、MAX 和MIN),输出答案。

Sample Input

3

0 1 1

1 2 2

8

SUM 0 2

MAX 0 2

N 0 1

SUM 0 2

MIN 0 2

C 1 3

SUM 0 2

MAX 0 2

Sample Output

3

2

1

-1

5

3

HINT

一共有10 个数据,对于第i (1 <= i <= 10) 个数据, N = M = i * 2000。

Solution

  • 这题可以直接用树链剖分+线段树维护。

  • 但我用的是 Link-Cut-Tree 练练手。

  • 注意权值在边上,可以在两个点之间加一个有权值的虚点来维护即可。

  • 还要注意上传标记的时候在点为虚点(有权值)的时候才更新最大最小值。

  • 如果要提取一个区间 [x,y][x,y] 的话,先 make_root(x)make\_root(x) ,保证在这条实链中 xx 之前没有点。

  • 之后再 access(y) , splay(y)access(y)\ ,\ splay(y) ,保证在这棵 SplaySplay 中 yy 没有右儿子。

  • 这时候节点 yy 即代表区间 [x,y][x,y] !直接在 y<script type="math/tex" id="MathJax-Element-500">y</script> 上操作即可。

Code

#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=4e4+2;
int n,tot,top;
int fa[N],s[N][2],st[N],num[N];
int key[N],mx[N],mn[N],sum[N],c[N];
bool rev[N],opp[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
inline void writeln(int x)
{write(x),putchar('\n');
}
inline bool pd(int x)
{return x==s[fa[x]][1];
}
inline bool isroot(int x)
{return s[fa[x]][0]^x && s[fa[x]][1]^x;
}
inline void modify(int x)
{if(x) swap(s[x][0],s[x][1]),rev[x]^=1;
}
inline void add(int x,int val)
{if(x) key[x]+=val,sum[x]+=val,mx[x]+=val,mn[x]+=val;
}
inline void change(int x)
{if(!x) return;swap(mx[x],mn[x]),mx[x]=-mx[x],mn[x]=-mn[x];key[x]=-key[x],sum[x]=-sum[x],opp[x]^=1;
}
inline void update(int x)
{mx[x]=max(mx[s[x][0]],mx[s[x][1]]);mn[x]=min(mn[s[x][0]],mn[s[x][1]]);if(x>n) mx[x]=max(mx[x],key[x]),mn[x]=min(mn[x],key[x]);sum[x]=sum[s[x][0]]+sum[s[x][1]]+key[x];
}
inline void down(int x)
{if(rev[x]){modify(s[x][0]),modify(s[x][1]);rev[x]=false;}if(c[x]){add(s[x][0],c[x]),add(s[x][1],c[x]);c[x]=0;}if(opp[x]){change(s[x][0]),change(s[x][1]);opp[x]=false;}
}
inline void rotate(int x)
{int y=fa[x],w=pd(x);if(s[y][w]=s[x][w^1]) fa[s[x][w^1]]=y;if((fa[x]=fa[y]) && !isroot(y)) s[fa[y]][pd(y)]=x;s[fa[y]=x][w^1]=y;update(y);
}
inline void splay(int x)
{for(int y=st[top=1]=x;!isroot(y);y=fa[y]) st[++top]=fa[y];while(top) down(st[top--]);for(int y;!isroot(x);rotate(x))if(!isroot(y=fa[x])) rotate(pd(x)==pd(y)?y:x);update(x);
}
inline void access(int x)
{for(int y=0;x;x=fa[y=x]) splay(x),s[x][1]=y,update(x);
}
inline void mkroot(int x)
{access(x),splay(x),modify(x);
}
inline void link(int x,int y)
{mkroot(x),fa[x]=y;
}
inline int getsum(int x,int y)
{mkroot(x),access(y),splay(y);return sum[y];
}
inline int getmax(int x,int y)
{mkroot(x),access(y),splay(y);return mx[y];
}
inline int getmin(int x,int y)
{mkroot(x),access(y),splay(y);return mn[y];
}
inline void reverse(int x,int y)
{mkroot(x),access(y),splay(y);change(y);
}
int main()
{n=tot=read();mx[0]=-1e9,mn[0]=1e9;for(int i=1;i<n;i++){int x=read()+1,y=read()+1,z=read();num[i]=++tot,link(x,tot),link(y,tot);key[tot]=mx[tot]=mn[tot]=sum[tot]=z;}int m=read();while(m--){char ch=getchar();while(ch^'C' && ch^'X' && ch^'I' && ch^'S' && ch^'N') ch=getchar();if(ch=='S') writeln(getsum(read()+1,read()+1)); elseif(ch=='X') writeln(getmax(read()+1,read()+1)); elseif(ch=='I') writeln(getmin(read()+1,read()+1)); elseif(ch=='N') reverse(read()+1,read()+1); else{int x=num[read()],val=read();access(x),key[x]=val,update(x);}}return 0;
}

BZOJ 2157: 旅游相关推荐

  1. BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2157 是 hydro 的 BZOJ ...

  2. bzoj 2157 旅行

    题目大意: 一个树 支持以下五种操作 C i w,表示对于经过第i条边的权值变成了w N u v,表示u 到v 的路径上的所有边的权值都变成原来的相反数. SUM u v,表示询问从u 到v 所获得的 ...

  3. 【BZOJ2157】旅游

    2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 1460  Solved: 656 [Submit][Status][Discuss ...

  4. linux收缩java位置,找到linux中当前java的安装位置

    先看java -version $java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111 ...

  5. bzoj 3999: [TJOI2015]旅游(树链剖分)

    3999: [TJOI2015]旅游 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 423  Solved: 214 [Submit][Status ...

  6. BZOJ 1097 [POI2007]旅游景点atr

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1097 思路 kk很小,考虑状压. 预处理出从11-(k+1)(k+1)出发,到其他点的距 ...

  7. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  8. ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】

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

  9. 2022-2028年中国康养旅游行业市场竞争力分析及发展策略分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国康养旅游行业市场行业相关概述.中国康养旅 ...

最新文章

  1. 9月第1周安全回顾 IM安全威胁严重 企业增加无线安全投入
  2. 中国电子学会图形化四级编程题:程序优化
  3. js将字符串中所有反斜杠\替换成正斜杠/
  4. pip安装python包出错:ctype = ctype.encode(default_encoding) # omit in 3.x!
  5. 全国软考数据库系统工程师教程(第2版)目录
  6. golang修改文件的最后访问时间,最后修改时间
  7. HomeBrew 更换为国内源--提高brew命令操作速度
  8. 学会使用 GDB 调试 Go 代码
  9. C语言之while和do-while
  10. 创业公司的技术总监,去上市公司面试,结果凉了。
  11. 分区助手是什么?(博主推荐)(图文详解)
  12. 微信新功能曝光:定时发送消息
  13. 微信扫码支付流程原理图
  14. 微信CRM系统哪家好?
  15. R语言笔记4_模型诊断(关于残差)
  16. Instagram Win10 UWP版更新:新增故事滤镜等大波功能
  17. 未来科学技十幻想画计算机,未来世界科幻画图片 你憧憬过这样的未来吗
  18. 汽车传动轴的优化设计matlab,传动轴的优化设计
  19. css制作三道杠小图标菜单图标
  20. 找规律填数字(难AC,细节多)

热门文章

  1. 机器学习--CART分类回归树
  2. 原:开辟内存时,可以以结构体为单位,这样测试,是对的吧?
  3. [ 云炬创业基础笔记]商业模式创新
  4. 云炬Android开发笔记 2-2 Android studio项目上传到Github及无法连接Github的问题处理
  5. Jupyter notebook入门教程(上)
  6. oracle数据库在sqlplus登录时遇到的问题
  7. const 常量_软件特攻队|const常量,不一样的新玩法
  8. 兼容IE和FF的js脚本做法(比较常用)[问题点数:20分]
  9. golang的GUI库,使用go-fyne设计一个代办事项APP
  10. ubuntu 20上安装gdbgui