传送门

解题思路

快被调死的码农题,,,其实就是一个边权下放到点权的线段树+树剖。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib> using namespace std;
const int MAXN = ;
const int inf = 0x3f3f3f3f; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int n,m,head[MAXN],cnt=,to[MAXN<<],nxt[MAXN<<],val[MAXN<<],num;
int w[MAXN],wt[MAXN],id[MAXN],top[MAXN],siz[MAXN],son[MAXN],fa[MAXN],dep[MAXN];
int Sum[MAXN<<],Min[MAXN<<],Max[MAXN<<];
bool rev[MAXN<<],lazy[MAXN<<]; inline void add(int bg,int ed,int ww){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt,val[cnt]=ww;
} void dfs1(int x,int f,int d){
dep[x]=d,fa[x]=f,siz[x]=;int maxson=-,u;
for(register int i=head[x];i;i=nxt[i]){
u=to[i];if(u==f) continue;
dfs1(u,x,d+);siz[x]+=siz[u];w[u]=val[i];
if(siz[u]>maxson) {maxson=siz[u];son[x]=u;}
}
} void dfs2(int x,int topf){
top[x]=topf;id[x]=++num;wt[num]=w[x];
if(!son[x]) return;dfs2(son[x],topf);int u;
for(register int i=head[x];i;i=nxt[i]){
u=to[i];if(u==fa[x] || u==son[x]) continue;
dfs2(u,u);
}
} inline void pushdown(int x){
rev[x<<]^=;rev[x<<|]^=;rev[x]^=;
Sum[x<<]=-Sum[x<<];Sum[x<<|]=-Sum[x<<|];
swap(Min[x<<],Max[x<<]);swap(Min[x<<|],Max[x<<|]);
Min[x<<]=-Min[x<<];Min[x<<|]=-Min[x<<|];
Max[x<<]=-Max[x<<];Max[x<<|]=-Max[x<<|];
} void build(int x,int l,int r){
if(l==r) {if(l==) Min[x]=inf,Max[x]=-inf; else Sum[x]=Min[x]=Max[x]=wt[l];return;}
int mid=(l+r)>>;
build(x<<,l,mid);build(x<<|,mid+,r);
Sum[x]=Sum[x<<]+Sum[x<<|];
Min[x]=min(Min[x<<],Min[x<<|]);
Max[x]=max(Max[x<<],Max[x<<|]);
} void update(int x,int l,int r,int L,int R,int ww){
if(L<=l && r<=R) {
if(ww==-inf) {rev[x]^=;Sum[x]=-Sum[x];swap(Min[x],Max[x]);Min[x]=-Min[x];Max[x]=-Max[x];}
else Sum[x]=Min[x]=Max[x]=ww;
return;
}
int mid=(l+r)>>;if(rev[x]) pushdown(x);
if(L<=mid) update(x<<,l,mid,L,R,ww);
if(mid<R) update(x<<|,mid+,r,L,R,ww);
Sum[x]=Sum[x<<]+Sum[x<<|];
Min[x]=min(Min[x<<],Min[x<<|]);
Max[x]=max(Max[x<<],Max[x<<|]);
} int query_Sum(int x,int l,int r,int L,int R){
if(L<=l && r<=R) return Sum[x];
int mid=(l+r)>>,ret=;if(rev[x]) pushdown(x);
if(L<=mid) ret+=query_Sum(x<<,l,mid,L,R);
if(mid<R) ret+=query_Sum(x<<|,mid+,r,L,R);
return ret;
} int query_Max(int x,int l,int r,int L,int R){
if(L<=l && r<=R) return Max[x];
int mid=(l+r)>>,ret=-inf;if(rev[x]) pushdown(x);
if(L<=mid) ret=max(ret,query_Max(x<<,l,mid,L,R));
if(mid<R) ret=max(ret,query_Max(x<<|,mid+,r,L,R));
return ret;
} int query_Min(int x,int l,int r,int L,int R){
if(L<=l && r<=R) return Min[x];
int mid=(l+r)>>,ret=inf;if(rev[x]) pushdown(x);
if(L<=mid) ret=min(ret,query_Min(x<<,l,mid,L,R));
if(mid<R) ret=min(ret,query_Min(x<<|,mid+,r,L,R));
return ret;
} void updRev(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
update(,,n,id[top[x]],id[x],-inf);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) update(,,n,id[x]+,id[y],-inf);
} inline int qSum(int x,int y){
int ret=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret+=query_Sum(,,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) ret+=query_Sum(,,n,id[x]+,id[y]);
return ret;
} inline int qMax(int x,int y){
int ret=-inf;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret=max(ret,query_Max(,,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) ret=max(ret,query_Max(,,n,id[x]+,id[y]));
return ret;
} inline int qMin(int x,int y){
int ret=inf;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret=min(ret,query_Min(,,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);if(x!=y) ret=min(ret,query_Min(,,n,id[x]+,id[y]));
return ret;
} inline int pre(int x){
return dep[to[x<<]]>dep[to[x<<^]]?to[x<<]:to[x<<^];
} int main(){
// freopen("wrong.out","w",stdout);
n=rd();int x,y,z;char s[];
for(int i=;i<n;i++){
x=rd()+,y=rd()+,z=rd();
add(x,y,z),add(y,x,z);
}
dfs1(,,);dfs2(,);build(,,n);m=rd();
while(m--){
scanf("%s",s+);x=rd(),y=rd();
if(s[]=='C') update(,,n,id[pre(x)],id[pre(x)],y);
else if(s[]=='N') updRev(x+,y+);
else if(s[]=='S') printf("%d\n",qSum(x+,y+));
else if(s[]=='A') printf("%d\n",qMax(x+,y+));
else printf("%d\n",qMin(x+,y+));
}
return ;
}

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

  1. BZOJ2157旅游——树链剖分+线段树

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

  2. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  3. 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点

    题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...

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

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

  5. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  6. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  7. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  8. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  9. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  10. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

随机推荐

  1. Python生成Windows可执行exe文件

    环境 python3.6.5 pyinstaller3.5 windows 10 下载地址 python:https://www.python.org/ftp/python/3.6.5/python- ...

  2. ECMAScript1.4 对象 | 简单数据类型与复杂数据类型 | 内置对象 | 基本包装类型 | String

    对象 函数和对象的区别: 函数:封装代码 对象:封装属性和方法 创建对象的方法: 1,对象字面量{} // 模拟创建一只dog var dog = { // 属性 name: 'puppy', age ...

  3. nutch2.2.1+mysql抓取数据

    基本环境:linux centos6.5 nutch2.2.1 源码包, mysql 5.5 ,elasticsearch1.1.1, jdk1.7 1.下载地址http://mirror.bjtu. ...

  4. Vmware Centos7 配置静态 ip 和 使宿主机和虚拟机互相 ping 通

    NAT 方式1. 配置静态 ipVmware 安装 Centos7 可以参考 https://blog.csdn.net/guo_ridgepole/article/details/78973763 ...

  5. Codeforces 479【E】div3

    题目链接:http://codeforces.com/problemset/problem/977/E 题意:就是给你相连边,让你求图内有几个环. 题解:我图论很差,一般都不太会做图论的题.QAQ看官 ...

  6. css---文本新增样式

    opacity属性指定了一个元素的透明度 默认值:1.0 不可继承    兼容性不是太好 兼容性写法 opacity{ opacity:0.5; filter:alpha(opacity=); //f ...

  7. Codeforces-GYM101873 G Water Testing 皮克定理

    题意: 给定一个多边形,这个多边形的点都在格点上,问你这个多边形里面包含了几个格点. 题解: 对于格点多边形有一个非常有趣的定理: 多边形的面积S,内部的格点数a和边界上的格点数b,满足如下结论: 2 ...

  8. 如何解决nodemon运行报错问题

    原因 nodemon没有被正确安装 解决方法 如果yarn global add nodemon --verbose安装没用的话,然后输入npm i nodemon -g --verbose使用NPM ...

  9. 尚学python课程---14、python中级语法

    尚学python课程---14.python中级语法 一.总结 一句话总结: var[1:5] 访问模式:比如字符串,比如列表元祖,字典等 del 删除模式:比如列表.元祖.字典 1.Python的N ...

  10. android GPS: code should explicitly check to see if permission is available

    转载的,感谢作者,由于我找了很久才找到这个解决方法,因此我自己再转一遍 原文链接 https://blog.csdn.net/qinwendou/article/details/77849048 if ...