BZOJ1180: [CROATIAN2009]OTOCI
一遍AC,开心!
$Link-Cut-Tree$最后一题
//BZOJ 1180 //by Cydiater //2016.9.18 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <iomanip> #include <cstdlib> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) const int MAXN=1e6+5; const int oo=0x3f3f3f3f; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int N,q[MAXN],top=0,M,nodea,nodeb,node,v; char op[15]; struct Tree{ int son[2],v,sum,tag,fa; }t[MAXN]; namespace solution{ inline bool get(int node){return t[t[node].fa].son[1]==node;} inline bool isroot(int node){return t[t[node].fa].son[0]!=node&&t[t[node].fa].son[1]!=node;} inline bool updata(int node){ if(node){ t[node].sum=t[node].v; if(t[node].son[0])t[node].sum+=t[t[node].son[0]].sum; if(t[node].son[1])t[node].sum+=t[t[node].son[1]].sum; } } inline void downit(int node){ if(t[node].tag){ t[t[node].son[0]].tag^=1;t[t[node].son[1]].tag^=1; swap(t[node].son[0],t[node].son[1]); t[node].tag^=1; } } inline void rotate(int node){ int old=t[node].fa,oldf=t[old].fa,which=get(node); if(!isroot(old))t[oldf].son[t[oldf].son[1]==old]=node; t[old].son[which]=t[node].son[which^1];t[t[old].son[which]].fa=old; t[node].son[which^1]=old;t[node].fa=oldf;t[old].fa=node; updata(old);updata(node); } inline void splay(int node){ top=0;q[++top]=node; for(int i=node;!isroot(i);i=t[i].fa)q[++top]=t[i].fa; down(i,top,1)downit(q[i]); while(!isroot(node)){ int old=t[node].fa,oldf=t[old].fa; if(!isroot(old))rotate(get(node)==get(old)?old:node); rotate(node); } } inline void access(int node){ int tmp=0; while(node){ splay(node);t[node].son[1]=tmp; updata(node);tmp=node; node=t[node].fa; } } inline void Reverse(int node){ access(node);splay(node);t[node].tag^=1; } inline void Link(int noda,int nodb){ Reverse(noda);t[noda].fa=nodb; } inline void Cut(int noda,int nodb){ Reverse(noda);access(nodb);splay(nodb); t[nodb].son[0]=t[noda].fa=0; } inline int find(int node){ access(node);splay(node); while(t[node].son[0])node=t[node].son[0]; return node; } inline void LCA(int noda,int nodb){ Reverse(nodb);access(noda);splay(noda); } inline void change(int node,int v){ access(node); splay(node); t[node].v=v;updata(node); } void init(){ N=read(); up(i,1,N){ t[i].v=t[i].sum=read(); t[i].son[0]=t[i].son[1]=t[i].fa=0; } } void slove(){ M=read(); while(M--){ scanf("%s",op); if(op[0]=='b'){ nodea=read();nodeb=read(); if(find(nodea)==find(nodeb))puts("no"); else{ puts("yes"); Link(nodea,nodeb); } } if(op[0]=='p'){ node=read();v=read(); change(node,v); } if(op[0]=='e'){ nodea=read();nodeb=read(); if(find(nodea)==find(nodeb)){ LCA(nodea,nodeb); printf("%d\n",t[nodea].sum); } else puts("impossible"); } } } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); slove(); return 0; }
BZOJ1180: [CROATIAN2009]OTOCI的更多相关文章
- BZOJ1180 [CROATIAN2009]OTOCI LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...
- BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT
题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通. 如果是则输出“no”.否则输出“yes”,并且在 ...
- BZOJ1180 [CROATIAN2009]OTOCI 【LCT】
题目 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出&qu ...
- [bzoj1180][CROATIAN2009]OTOCI_LCT
OTOCI bzoj-1180 CROATIAN-2009 题目大意:给你n个离散的点,m个操作.支持:两点加边(保证还是森林),修改单点权值,询问两点是否联通,查询联通两点之间路径权值. 注释:$1 ...
- BZOJ 1180: [CROATIAN2009]OTOCI [LCT]
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 961 Solved: 594[Submit][S ...
- BZOJ 1180: [CROATIAN2009]OTOCI
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 989 Solved: 611[Submit][S ...
- 1180: [CROATIAN2009]OTOCI(LCT)
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1200 Solved: 747[Submit][ ...
- 1180: [CROATIAN2009]OTOCI
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1032 Solved: 638[Submit][ ...
- 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT
竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...
随机推荐
- 你能熟练使用Dictionary字典和List列表吗?(转)
命名空间System.Collections.Generic中有两个非常重要,而且常用的泛型集合类,它们分别是Dictionary<TKey,TValue>字典和List<T> ...
- jQuery升级踩坑大全
jQuery升级踩坑大全 背景 jQuery想必各个web工程师都再熟悉不过了,不过现如今很多网站还采用了很古老的jQuery版本.其实如果早期版本使用不当,可能会有DOMXSS漏洞,非常建议升级到j ...
- Scala集合操作
大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: 1.数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储技术现在比较经典方案是使用Hadoop,不过也很多方案采用Kafka. ...
- jquery 选择器大全
jquery 选择器大体上可分为4 类: 1.基本选择器 2.层次选择器 3.过滤选择器 4.表单选择器 其中过滤选择器可以分为: 1.简单过滤选择器 2.内容过滤选择器 3.可见性过滤选择器 4.属 ...
- Stem函数绘图
stem(n,x,'filled');第三个参数是绘图的样式,filled就是填充,将圆圈填充. Stem函数绘图各种不同的绘图函数分别适用于不同的场合,使用“stem”绘制针状图最简单,从附录中提供 ...
- Android开发之Menu和actionBar
一.通过Menu目录下创建一个布局文件: 先看代码meu/main.xml: <?xml version="1.0" encoding="utf-8"?& ...
- Hibernate用注解实现实体类和表的映射
数据库mysql: 1.一对一 person50表password50表是一对一的关系: password50表中有外键 person_id person实体类: package com.c50.en ...
- canvas三角函数直线运动
var canvas = document.getElementById("canvas"); var cxt = canvas.getContext("2d" ...
- Java微信公众号开发-外网映射工具配置
一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ...
- java 枚举的常见使用方法
JDK1.5引入了新的类型-枚举,枚举的出现在日常开发中带来了极大的方便. 常用方法一:常量 JDK1.5之前我们平时定义系统常量,基本都是用public static final ... 出现枚举以 ...