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,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...
随机推荐
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- 架构系列:ASP.NET 项目结构搭建
我们头开始,从简单的单项目解决方案,逐步添加业务逻辑的约束,从应用逻辑和领域逻辑两方面考虑,从简单的单个项目逐步搭建一个多项目的解决方案.主要内容:(1)搭建应用逻辑和领域逻辑都简单的单项目 (2)为 ...
- [转]史上最全的CSS hack方式一览
做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...
- android之拍照与摄像
拍照和摄像的意图很简答,这里直接贴代码 布局文件 <?xml version="1.0" encoding="utf-8"?> <Linear ...
- Android之Activity跳转
简述 如果把每个activity看成一个页面的话,那么activity之间的跳转和页面的之间的跳转基本上是一样的.首先需要监听一个事件,当这个事件发生的时候,就进行跳转.html中有个<a sr ...
- nodepad++快捷键收集
Notepad++ 快捷键 大全Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+Z 撤消Ctrl+Y 恢复Ctrl+A 全选Ctrl+F 键查找对话框启动Ctrl+H 查找/替换对话框 ...
- Hibernate Synchronizer3——一个和hibernate Tool类似的小插件之使用方法
首先,要告诉大家的是,当我们要自动生成Mapping File的时候,我们除了使用hibernae tools之外,还可以通过一个更为简洁的插件,只需通过点击: 1.Hibernate Configu ...
- 【CSS】 background
background: #22b4ff //背景色 url("http://images.cnblogs.com/cnblogs_com/oiliu/529256/o_titleIMG.jp ...
- SwipeRefreshLayout 首次打开出现加载图标
最近要实现如何如图效果: 主要是在初始化,代码如下: , getResources().getDimensionPixelSize(typed_value.resourceId)); refre ...
- 【POJ 2774】Long Long Message 最长公共子串
还是模板啊,手残&&打成||查错查了1h+TAT #include<cstdio> #include<cstring> #include<algorith ...