luoguP1505 [国家集训队]旅游(真的毒瘤)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(Arr,x) memset(Arr,x,sizeof(Arr))
const int maxN=;
const int maxM=maxN*;
const int inf=;
class SegmentData
{
public:
int sum;
int mn,mx;
int mega;
};
int n;
int edgecnt=,Head[maxN],Next[maxM],V[maxM],W[maxM];
int Fa[maxN],Size[maxN],Hson[maxN],Top[maxN],Faedge[maxN],Depth[maxN];
int idcnt=,Id[maxN];
SegmentData S[maxN*];
void Add_Edge(int u,int v,int w);
void _Add(int u,int v,int w);
void dfs1(int u);
void dfs2(int u,int top);
int QC_max(int u,int v);//查询路径最大值
int QC_min(int u,int v);//查询路径最小值
int QC_sum(int u,int v);//查询路径和
void QC_nega(int u,int v);//把路径上所有边权取负
void PushDown(int now);//线段树下放标记
void Update(int now);//线段树更新
void Modify(int now,int l,int r,int pos,int key);//线段树单点修改
void Makenega(int now,int l,int r,int ql,int qr);//线段树区间取负
int Query_max(int now,int l,int r,int ql,int qr);//线段树区间最大
int Query_min(int now,int l,int r,int ql,int qr);//线段树区间最小
int Query_sum(int now,int l,int r,int ql,int qr);//线段树区间求和
int main(){
mem(Head,-);
scanf("%d",&n);
for (int i=;i<n;i++){
int u,v,w;scanf("%d%d%d",&u,&v,&w);u++;v++;
Add_Edge(u,v,w);
}
Depth[]=;
dfs1();
dfs2(,);
int Q;scanf("%d",&Q);
char opt[];
while (Q--){
scanf("%s",opt);
if (opt[]=='C'){
int pos,key;scanf("%d%d",&pos,&key);pos++;
pos=Id[pos];
Modify(,,n,pos,key);
}
if (opt[]=='N'){
int u,v;scanf("%d%d",&u,&v);u++;v++;
QC_nega(u,v);
}
if (opt[]=='S'){
int u,v;scanf("%d%d",&u,&v);u++;v++;
printf("%d\n",QC_sum(u,v));
}
if (opt[]=='A'){
int u,v;scanf("%d%d",&u,&v);u++;v++;
printf("%d\n",QC_max(u,v));
}
if (opt[]=='I'){
int u,v;scanf("%d%d",&u,&v);u++;v++;
printf("%d\n",QC_min(u,v));
}
}
return ;
}
void Add_Edge(int u,int v,int w)
{
_Add(u,v,w);_Add(v,u,w);return;
}
void _Add(int u,int v,int w){
edgecnt++;Next[edgecnt]=Head[u];Head[u]=edgecnt;V[edgecnt]=v;W[edgecnt]=w;
return;
}
void dfs1(int u){
Size[u]=;
for (int i=Head[u];i!=-;i=Next[i])
if (V[i]!=Fa[u]){
Fa[V[i]]=u;Faedge[V[i]]=W[i];
Depth[V[i]]=Depth[u]+;
dfs1(V[i]);
Size[u]+=Size[V[i]];
if (Size[V[i]]>Size[Hson[u]]) Hson[u]=V[i];
}
return;
} void dfs2(int u,int top){
Id[u]=++idcnt;
Modify(,,n,idcnt,Faedge[u]);
Top[u]=top;
if (Hson[u]==) return;
dfs2(Hson[u],top);
for (int i=Head[u];i!=-;i=Next[i])
if ((V[i]!=Fa[u])&&(V[i]!=Hson[u])) dfs2(V[i],V[i]);
return;
} int QC_max(int u,int v){
int ret=-inf;
while (Top[u]!=Top[v]){
if (Depth[Top[u]]<Depth[Top[v]]) swap(u,v);
ret=max(ret,Query_max(,,n,Id[Top[u]],Id[u]));
u=Fa[Top[u]];
}
if (Depth[u]>Depth[v]) swap(u,v);
if (u!=v) ret=max(ret,Query_max(,,n,Id[u]+,Id[v]));
return ret;
} int QC_min(int u,int v){
int ret=inf;
while (Top[u]!=Top[v]){
if (Depth[Top[u]]<Depth[Top[v]]) swap(u,v);
ret=min(ret,Query_min(,,n,Id[Top[u]],Id[u]));
u=Fa[Top[u]];
}
if (Depth[u]>Depth[v]) swap(u,v);
if (u!=v) ret=min(ret,Query_min(,,n,Id[u]+,Id[v]));
return ret;
} int QC_sum(int u,int v){
int ret=;
while (Top[u]!=Top[v]){
if (Depth[Top[u]]<Depth[Top[v]]) swap(u,v);
ret=ret+Query_sum(,,n,Id[Top[u]],Id[u]);
u=Fa[Top[u]];
}
if (Depth[u]>Depth[v]) swap(u,v);
if (u!=v) ret=ret+Query_sum(,,n,Id[u]+,Id[v]);
return ret;
} void QC_nega(int u,int v){
while (Top[u]!=Top[v])
{
if (Depth[Top[u]]<Depth[Top[v]]) swap(u,v);
Makenega(,,n,Id[Top[u]],Id[u]);
u=Fa[Top[u]];
}
if (Depth[u]>Depth[v]) swap(u,v);
if (u!=v) Makenega(,,n,Id[u]+,Id[v]);
return;
} void PushDown(int now){
if (S[now].mega)
{
S[now].mega=;
int lson=now*,rson=now*+;
swap(S[lson].mx,S[lson].mn);swap(S[rson].mx,S[rson].mn);
S[lson].mx=-S[lson].mx;S[lson].mn=-S[lson].mn;
S[rson].mx=-S[rson].mx;S[rson].mn=-S[rson].mn;
S[lson].sum=-S[lson].sum;S[rson].sum=-S[rson].sum;
S[lson].mega^=;S[rson].mega^=;
}
return;
} void Update(int now){
int lson=now*,rson=now*+;
S[now].mx=max(S[lson].mx,S[rson].mx);
S[now].mn=min(S[lson].mn,S[rson].mn);
S[now].sum=S[lson].sum+S[rson].sum;
return;
} void Modify(int now,int l,int r,int pos,int key){
PushDown(now);
if (l==r){
S[now].mx=S[now].mn=S[now].sum=key;
return;
}
int mid=(l+r)/;
if (pos<=mid) Modify(now*,l,mid,pos,key);
if (pos>=mid+) Modify(now*+,mid+,r,pos,key);
Update(now);return;
} void Makenega(int now,int l,int r,int ql,int qr){
PushDown(now);
if ((l==ql)&&(r==qr)){
S[now].mega^=;swap(S[now].mx,S[now].mn);
S[now].mx=-S[now].mx;S[now].mn=-S[now].mn;
S[now].sum=-S[now].sum;
return;
}
int mid=(l+r)/;
if (qr<=mid) Makenega(now*,l,mid,ql,qr);
else if (ql>=mid+) Makenega(now*+,mid+,r,ql,qr);
else{
Makenega(now*,l,mid,ql,mid);Makenega(now*+,mid+,r,mid+,qr);
}
Update(now);return;
} int Query_max(int now,int l,int r,int ql,int qr){
PushDown(now);
if ((l==ql)&&(r==qr)) return S[now].mx;
int mid=(l+r)/;
if (qr<=mid) return Query_max(now*,l,mid,ql,qr);
else if (ql>=mid+) return Query_max(now*+,mid+,r,ql,qr);
else return max(Query_max(now*,l,mid,ql,mid),Query_max(now*+,mid+,r,mid+,qr));
}
int Query_min(int now,int l,int r,int ql,int qr){
PushDown(now);
if ((l==ql)&&(r==qr)) return S[now].mn;
int mid=(l+r)/;
if (qr<=mid) return Query_min(now*,l,mid,ql,qr);
else if (ql>=mid+) return Query_min(now*+,mid+,r,ql,qr);
else return min(Query_min(now*,l,mid,ql,mid),Query_min(now*+,mid+,r,mid+,qr));
}
int Query_sum(int now,int l,int r,int ql,int qr){
PushDown(now);
if ((l==ql)&&(r==qr)) return S[now].sum;
int mid=(l+r)/;
if (qr<=mid) return Query_sum(now*,l,mid,ql,qr);
else if (ql>=mid+) return Query_sum(now*+,mid+,r,ql,qr);
else return Query_sum(now*,l,mid,ql,mid)+Query_sum(now*+,mid+,r,mid+,qr);
}
luoguP1505 [国家集训队]旅游(真的毒瘤)的更多相关文章
- 洛谷 P1505 [国家集训队]旅游 解题报告
P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游 ...
- 树链剖分【洛谷P1505】 [国家集训队]旅游
P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城 ...
- 洛谷 P1505 [国家集训队]旅游 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...
- ⌈洛谷1505⌋⌈BZOJ2157⌋⌈国家集训队⌋旅游【树链剖分】
题目链接 [洛谷] [BZOJ] 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T ...
- 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)
旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...
- P1505 [国家集训队]旅游
\(\color{#0066ff}{题 目 描 述}\) Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了 ...
- 树链剖分【p1505】[国家集训队]旅游
Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...
- 洛谷P1505 [国家集训队]旅游
题目描述 \(Ray\) 乐忠于旅游,这次他来到了\(T\) 城.\(T\) 城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,\(T ...
- P1505 [国家集训队]旅游[树剖]
题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路 ...
随机推荐
- c# 读取二进制文件并转换为 16 进制显示
string result = ""; string filePath = "xxx.bin"; if (File.Exists(filePath)) { by ...
- centos 7 jdk
1.去oracle官网下载 2.查看当前环境中安装了那些jdk,如果有那么卸载掉 安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息: java versi ...
- tpcc-mysql测试mysql5.6 (xfs文件系统)
操作系统版本:CentOS release 6.5 (Final) 2.6.32-431.el6.x86_64 #1 内存:32G CPU:Intel(R) Xeon(R) CPU E5-2450 ...
- 设置div 居中 和得到dom元素高度
javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...
- centos 6.5 安装 nginx
从nginx官网下载安装包:nginx-1.8.1.tar.gz,解压 tar xvf nginx-1.8.1.tar.gz -C /usr/local 安装依赖 yum install gcc yu ...
- OSI参考模型与TCP/IP参考模型与TCP/IP协议栈
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484126.html OSI参考模型与TCP/IP参考模型与TCP/IP协议栈 TCP/IP分层模型 ...
- 01-跨域-jsonp原理
jsonp能跨域,并不是因为它发送了ajax请求,而是利用动态创建的script标签. script标签没有收到浏览器同源策略的限制,是可以跨域访问的. 创建的script标签,把其src指向请求的服 ...
- 【CF1257E】The Contest【线段树】
题意:给定三个序列abc,问最少操作几次使得满足a<b<c 题解:将三个序列合并起来,设cnt[i][1/2/3]表示前i个数有几个是来自序列1/2/3的. 枚举第一个序列要到i,此时对于 ...
- WIN7自带端口转发渗透小技巧
目标是WIN7 X64,且开启了防火墙,想要用他的机器去访问别的机器,又不想登陆他的系统,常规办法一般是上传一个htran,然后进行转发,但是对方有杀软,有被杀的可能性,所以我用另外一种办法达到我的目 ...
- HDU | 1874 畅通工程续 SPFA&DIJIESITLA
题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰 ...