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 ...
随机推荐
- 2.用Python套用Excel模板,一键完成原亮样式
from xlutils.copy import copy import xlrd import xlwt tem_excel=xlrd.open_workbook('日统计.xls',formatt ...
- Caused by: java.io.FileNotFoundException: class path resource [com/cxy/springboot/mapping/] cannot be resolved to URL because it does not exist
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- jdbc_mysql----interset
- Tomcat Geoserver等服务器 端口号修改
端口号修改是我们经常会用到的,这里整理一下我们常见的服务器端口号修改位置,后面在用到的时候会持续更新 注意:端口号修改服务都需要重启才有效. 1.Tomcat 位置:..\tomcat路径\conf\ ...
- 【转】WebResource实现在自定义控件中内嵌JS文件
在类库中的资源 其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发 ...
- 2018-12-1-WPF-修改-ItemContainerStyle-鼠标移动到未选中项效果和选中项背景
title author date CreateTime categories WPF 修改 ItemContainerStyle 鼠标移动到未选中项效果和选中项背景 lindexi 2018-12- ...
- SQLserver执行命令
方法一:xp_cmdshell exec master..xp_cmdshell "whoami"默认执行是关闭 EXEC sp_configure 'show advanced ...
- Hive HA基本原理
- 数据库MySQL--常见基础命令
基础命令: 查看所有数据库:show databases; 打开指定的数据库:use 库名: 查看当前库的所有表:show tables; 查看数据库其他库中的表:show tables from 库 ...
- centos7 创建桌面快捷方式(chrome,eclipse)
在将eclipse-SDK-3.7.2-Linux-gtk.tar.gz解压到某个目录下之后,命令行进行如下编辑 vi /usr/share/applications/eclipse.desktop ...