BZOJ_1180_[CROATIAN2009]_OTOCI_(LCT)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1180
三种操作:
1.询问x,y是否连通,如果不连通,建一条边x,y
2.把x节点的权值改为t.
3.询问节点x,y路径上的权值和.
分析
裸的LCT.
但是...
但是!
现在才发现自己LCT改值的函数写的是错的!当我们询问x到y路径上的和值的时候,要先Access(y)(并且splay(y)),此时Splay的根是y,并且y在从最右边被splay转上来的时候所有经过的点都push_up()过了,但是在y被splay转上来之前的splay的根节点的左子树却没有push_up(),这样没有更新,就会出错.
所以在更改x节点的权值之前一定要把x给splay一下!
等下去把之前的博文里的错误改掉.
#include <bits/stdc++.h>
using namespace std; const int maxn=+;
int n,m;
struct node{
node* ch[],* pa;
int v,s; bool rev;
node(int v,node* x):v(v),s(v){ ch[]=ch[]=pa=x; }
bool d(){ return pa->ch[]==this; }
bool c(){ return pa->ch[]==this||pa->ch[]==this; }
void setc(node* x,bool d){ ch[d]=x; x->pa=this; }
void push_up(){ s=ch[]->s+ch[]->s+v; }
void push_down(){
if(rev){
ch[]->rev^=true;
ch[]->rev^=true;
swap(ch[],ch[]);
rev=false;
}
}
}* null,* t[maxn];
void rot(node* x){
node* pa=x->pa; bool d=x->d();
pa->push_down(); x->push_down();
if(pa->c()) pa->pa->setc(x,pa->d());
else x->pa=pa->pa;
pa->setc(x->ch[!d],d);
x->setc(pa,!d);
pa->push_up();
}
void fix(node* x){
if(x->c()) fix(x->pa);
x->push_down();
}
void splay(node* x){
fix(x);
while(x->c())
if(!x->pa->c()) rot(x);
else x->d()==x->pa->d()?(rot(x->pa),rot(x)):(rot(x),rot(x));
x->push_up();
}
void access(node* x){
node *t=x;
for(node* y=null; x!=null; y=x, x=x->pa){
splay(x);
x->ch[]=y;
}
splay(t);
}
node* find_root(node* x){
access(x);
while(x->ch[]!=null) x=x->ch[];
return x;
}
void make_root(node* x){
access(x);
x->rev^=true;
}
void link(node* x,node* y){
if(find_root(x)==find_root(y)){
puts("no");
return;
}
puts("yes");
make_root(x);
x->pa=y;
}
void query(node* x,node* y){
if(find_root(x)!=find_root(y)){
puts("impossible");
return;
}
make_root(x);
access(y);
printf("%d\n",y->s);
}
void change(node* x,int y){
x->v=y;
x->push_up();
}
int main(){
null=new node(,NULL);
scanf("%d",&n);
for(int i=;i<=n;i++){
int x; scanf("%d",&x);
t[i]=new node(x,null);
}
scanf("%d",&m);
for(int i=;i<=m;i++){
char c[]; int x,y;
scanf("%s%d%d",c,&x,&y);
if(c[]=='b') link(t[x],t[y]);
else if(c[]=='p') change(t[x],y);
else query(t[x],t[y]);
}
return ;
}
1180: [CROATIAN2009]OTOCI
Time Limit: 50 Sec Memory Limit: 162 MB
Submit: 848 Solved: 529
[Submit][Status][Discuss]
Description
给
出n个结点以及每个点初始时对应的权值wi。起始时点与点之间没有连边。有3类操作: 1、bridge A
B:询问结点A与结点B是否连通。如果是则输出“no”。否则输出“yes”,并且在结点A和结点B之间连一条无向边。 2、penguins A
X:将结点A对应的权值wA修改为X。 3、excursion A
B:如果结点A和结点B不连通,则输出“impossible”。否则输出结点A到结点B的路径上的点对应的权值的和。给出q个操作,要求在线处理所有操
作。数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。
Input
第
一行包含一个整数n(1<=n<=30000),表示节点的数目。第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。第三行包
含一个整数q(1<=n<=300000),表示操作的数目。以下q行,每行包含一个操作,操作的类别见题目描述。任意时刻每个节点对应的权
值都是1到1000的整数。
Output
输出所有bridge操作和excursion操作对应的输出,每个一行。
Sample Input
4 2 4 5 6
10
excursion 1 1
excursion 1 2
bridge 1 2
excursion 1 2
bridge 3 4
bridge 3 5
excursion 4 5
bridge 1 3
excursion 2 4
excursion 2 5
Sample Output
impossible
yes
6
yes
yes
15
yes
15
16
HINT
Source
BZOJ_1180_[CROATIAN2009]_OTOCI_(LCT)的更多相关文章
- BZOJ_1180_[CROATIAN2009]OTOCI_LCT
BZOJ_1180_[CROATIAN2009]OTOCI_LCT Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A ...
- BZOJ 1180: [CROATIAN2009]OTOCI [LCT]
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 961 Solved: 594[Submit][S ...
- BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT
题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通. 如果是则输出“no”.否则输出“yes”,并且在 ...
- BZOJ1180 [CROATIAN2009]OTOCI LCT
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...
- 【bzoj1180】[CROATIAN2009]OTOCI LCT
题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出“no”.否则输出“yes”,并且在结点 ...
- 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT
竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...
- BZOJ1180 [CROATIAN2009]OTOCI 【LCT】
题目 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出&qu ...
- 1180: [CROATIAN2009]OTOCI(LCT)
1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 1200 Solved: 747[Submit][ ...
- bzoj 1180: [CROATIAN2009]OTOCI【LCT】
一道几乎是板子的LCT,但是沉迷数学很久时候突然1A了这道题还是挺开心的 #include<iostream> #include<cstdio> using namespace ...
随机推荐
- MySQL的记录长度
MySQL的记录长度 MySQL默认规定一条记录最大的长度是65535字节,所有的字段加在一起所占的字节数不能超过65535.但是MySQL中字段的长度有的时使用字节来规定int,有些字段类型是使用字 ...
- JSP九大内置对象(转载)
JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1. ...
- 快速开启Windows 的各种任务及 bat(ch)脚本
MSC It is the Microsoft Management Console Snap-in Control File, like services.msc, devmgmt.msc (Dev ...
- [DP] LGTB 玩THD (复杂状态DP)
LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...
- 第9条:覆盖equals时总要覆盖hashCode
在每个覆盖equals方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,Hash ...
- treeview OnSelectedNodeChanged js的方法
可以在OnSelectedNodeChanged的cs中,对node赋值如此: nod.Text = "<span onclick=''>" + node名称 + &q ...
- 啊哈!算法:解密QQ号
书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下: #include <stdio.h> void decode( ...
- centos7下添加win7引导
这次在centos7下添加为win7引导的过程可谓是一波三折,首先是在网上找教程,这个过程还是很顺利的,通不断的 搜索,找到了两个办法.第一个办法就是在root下执行这样的一个命令: grub2-mk ...
- .Net 中资源的使用方式
近期要在小丸工具箱中添加一个启动画面,画面中需要使用一个GIF动图.经过学习和实验,总结了几个读取资源的方式,罗列如下. 一.使用外部资源 Image img = Image.FromFile(&qu ...
- sae-服务器php运行环境配置
config.yaml 语法- OPTION: ARG1 ARG2 ... - OPTION: if (CONDICTIONs) ACTION CONDITION可以是以下任意一种: 使用 == 和 ...