BZOJ 2157: 旅游
来源:互联网 发布:手机淘宝账号怎么激活 编辑:程序博客网 时间:2024/04/29 16:41
题意如往常一般省略啦。
这道题感觉比前几道有了点意思,关于维护其实差不多。
但是这题的权值是在边上,所以我们弄多一个点在两点中间表示边权 也就是:x->++id->y
取反的话注意一下 max=-min min=-max就好 这个不难懂吧?
代码:
#include<map>#include<cmath>#include<queue>#include<string>#include<cstdio>#include<vector>#include<cstdlib>#include<cstring>#include<algorithm>#define inf 1000000000#define me(a,x) memset(a,x,sizeof a)#define cp(a,x) memcpy(a,x,sizeof a)#define N 20010using namespace std;typedef long long LL;int fa[N<<1],n,m,c[N<<1][2],st[N<<1],w[N<<1];int e[N],mx[N<<1],mn[N<<1],sum[N<<1];bool rev[N<<1],turn[N<<1];bool Rt(int x){ if(c[fa[x]][0]==x || c[fa[x]][1]==x)return 0; return 1;}void pushup(int x){ int l=c[x][0],r=c[x][1]; sum[x]=sum[l]+sum[r]+w[x]; mx[x]=max(mx[l],mx[r]); mn[x]=min(mn[l],mn[r]); if(x>n)mx[x]=max(mx[x],w[x]); if(x>n)mn[x]=min(mn[x],w[x]);}void rever(int x){ if(!x)return; sum[x]=-sum[x],w[x]=-w[x]; swap(mx[x],mn[x]); mx[x]=-mx[x],mn[x]=-mn[x]; turn[x]^=1;}void pushdown(int x){ int l=c[x][0],r=c[x][1]; if(turn[x]) { turn[x]=0; rever(l); rever(r); } if(rev[x]) { rev[x]=0,rev[l]^=1,rev[r]^=1; swap(c[x][0],c[x][1]); }}void rotate(int x){ int y=fa[x],z=fa[y],a=c[y][1]==x,b=c[z][1]==y,g=c[x][!a]; if(!Rt(y))c[z][b]=x; fa[g]=y,c[y][a]=g; fa[y]=x,c[x][!a]=y; fa[x]=z; pushup(y); pushup(x);}void splay(int x){ int top=0,i; for(i=x;!Rt(i);i=fa[i])st[++top]=i; st[++top]=i; for(i=top;i;i--)pushdown(st[i]); while(!Rt(x)) { int y=fa[x],z=fa[y],a=c[y][1]==x,b=c[z][1]==y; if(!Rt(y)) { if(a==b)rotate(y); else rotate(x); } rotate(x); }}void access(int x){ int last=0; while(x) { splay(x); c[x][1]=last; pushup(x); last=x,x=fa[x]; }}void make_root(int x){ access(x); splay(x); rev[x]^=1;}void split(int x,int y){ make_root(x); access(y); splay(y);}void link(int x,int y){ make_root(x); fa[x]=y;}void cut(int x,int y){ split(x,y); fa[x]=c[y][0]=0;}int main(){ int i,x,y,p; char ch[5]; scanf("%d",&n); for(i=0;i<=n;i++) mn[i]=inf,mx[i]=-inf; int id=n; for(i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&p); x++,y++; e[i]=++id; link(x,id); link(y,id); w[id]=sum[id]=mx[id]=mn[id]=p; } scanf("%d",&m); while(m--) { scanf("%s%d%d",ch,&x,&y); x++,y++; if(ch[0]=='C') { x--,y--; splay(e[x]); w[e[x]]=y; pushup(e[x]); } if(ch[0]=='N') split(x,y),rever(y); if(ch[0]=='S') split(x,y),printf("%d\n",sum[y]); if(ch[1]=='A') split(x,y),printf("%d\n",mx[y]); if(ch[1]=='I') split(x,y),printf("%d\n",mn[y]); } return 0;}
1 0
- BZOJ 2157 旅游 树链剖分
- BZOJ 2157 旅游 树链剖分
- BZOJ 2157: 旅游
- [BZOJ]2157: 旅游 树链剖分
- BZOJ 2157: 旅游 树链剖分
- bzoj 2157 旅游
- BZOJ 2157: 旅游 树链剖分
- BZOJ 2157: 旅游
- [动态树 LCT] BZOJ 2157 旅游
- BZOJ 2157 旅游【裸链剖+线段树
- bzoj 2157: 旅游 树链剖分+线段树
- BZOJ[2157]旅游 树链剖分+线段树
- BZOJ 5063: 旅游 splay
- 【BZOJ 2657】 [Zjoi2012]旅游(journey)
- [bzoj 2657] [Zjoi2012]旅游(journey)
- BZOJ 2657: [Zjoi2012]旅游(journey)
- BZOJ 2657 [Zjoi2012]旅游(journey)
- 【BZOJ】2657: [Zjoi2012]旅游(journey)
- 简单几步activity实现ios侧滑删除效果
- 【模拟】NEERC15 A Adjustment Office (Codeforces GYM 100851)
- pixhawk软件分析之代码框架与文件结构
- Client-Server C程序示例C (使用 Sockets 和 TCP)
- leetcode:数学:Ugly Number II(264)
- BZOJ 2157: 旅游
- 《深度探索c++对象模型》读书笔记(一)
- 快速幂取余深度讲解
- 解决ScrollView下嵌套GridView显示不全的问题
- C#使用FastReport 报表初步体验(图文)
- HBase架构精讲
- springMVC提交form表单页面不跳转
- Android开发短视频录制
- 【SQLSERVER】事务相关存储过程Demo