LUOGU P1505 [国家集训队]旅游 (树链剖分+线段树)
解题思路
快被调死的码农题,,,其实就是一个边权下放到点权的线段树+树剖。
#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 [国家集训队]旅游 (树链剖分+线段树)的更多相关文章
- BZOJ2157旅游——树链剖分+线段树
题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...
- bzoj 2157: 旅游【树链剖分+线段树】
裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...
- 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点
题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- POJ3237 (树链剖分+线段树)
Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- HDU4897 (树链剖分+线段树)
Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...
- 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 ...
随机推荐
- 新建的maven项目里没有src
百度上搜到一个网友的一句话:没筷子你就不吃饭了是吧 若有所思 自己新建一个src文件 然后, 由于已经转换,因此上图没有sources选项 然后就可以在文件中随意编写文件 如果想添加package,直 ...
- Flink 1.6.0 Windows操作
原文连接 https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/stream/operators/windows.html W ...
- 23-Ubuntu-文件和目录命令-查看文件内容-more 和 cat
1. more---适合查看内容多的文件 格式: more 文件名 操作键 功能 空格键 显示手册页下一屏 Enter键 一次滚动手册页的一行 b 返回上一屏 f 前滚一屏 q 退出 例: more ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)
2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred) easy: ACE ...
- Nginx常用功能配置一
Nginx常用功能配置 参数include配置 说明:如果日常工作中server标签存在太多,可以采用include配置模式,Nginx的主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目 ...
- xx市xx项目运维工作方案
注:提供给各位正在做项目,或准备做项目的朋友,仅供参考,用于后期运维提供的方案模板.仅供参考. 因为直接从word复制,会有一些排版的问题.可以留邮箱. xx市xx项目运维工作方案 xx有限公司 20 ...
- 2018-9-29-Roslyn-通过-Nuget-引用源代码-在-VS-智能提示正常但是无法编译
title author date CreateTime categories Roslyn 通过 Nuget 引用源代码 在 VS 智能提示正常但是无法编译 lindexi 2018-09-29 1 ...
- JS关闭当前父级div
代码: <img src="img/diagram.png" onclick="javascript:this.parentNode.parentNode.remo ...
- 读取数据库的数据并转换成List<>
一.在有帮助类DbHelperSQL的时候 1.下为其中返回SqlDataReader的方法 /// <summary> /// 执行查询语句,返回SqlDataReader ( 注意:调 ...
- Got permission denied while trying to connect to the Docker daemon
答案:https://stackoverflow.com/questions/48568172/docker-sock-permission-denied