描述


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

5
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

4
impossible
yes
6
yes
yes
15
yes
15
16

HINT

Source

BZOJ_1180_[CROATIAN2009]_OTOCI_(LCT)的更多相关文章

  1. BZOJ_1180_[CROATIAN2009]OTOCI_LCT

    BZOJ_1180_[CROATIAN2009]OTOCI_LCT Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作:  1.bridge A ...

  2. BZOJ 1180: [CROATIAN2009]OTOCI [LCT]

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 961  Solved: 594[Submit][S ...

  3. BZOJ2843极地旅行社&BZOJ1180[CROATIAN2009]OTOCI——LCT

    题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作:  1.bridge A B:询问结点A与结点B是否连通. 如果是则输出“no”.否则输出“yes”,并且在 ...

  4. BZOJ1180 [CROATIAN2009]OTOCI LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...

  5. 【bzoj1180】[CROATIAN2009]OTOCI LCT

    题目描述 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出“no”.否则输出“yes”,并且在结点 ...

  6. 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT

    竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...

  7. BZOJ1180 [CROATIAN2009]OTOCI 【LCT】

    题目 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出"no".否则输出&qu ...

  8. 1180: [CROATIAN2009]OTOCI(LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1200  Solved: 747[Submit][ ...

  9. bzoj 1180: [CROATIAN2009]OTOCI【LCT】

    一道几乎是板子的LCT,但是沉迷数学很久时候突然1A了这道题还是挺开心的 #include<iostream> #include<cstdio> using namespace ...

随机推荐

  1. NOIP(提高组)DAY1国王游戏

    问题描述 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这n位大臣排成一排,国王站在队伍的最前面.排好队 ...

  2. Linux Vi的使用

    1.vi使用三模式:一般模式,插入模式,命令模式 保存和退出vi: 命令模式下 :w 保存 :w 新文件 保存到新文件 类似另存为,新文件存在,报错 :w! 新文件 保存到新文件,新文件存在,覆盖 : ...

  3. animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画

    通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...

  4. Missra开源前端框架

    Missra开源前端框架,官方网址:http://framework.missra.com

  5. Super Hide IP 3.4.7.8允许您以匿名方式进行网上冲浪、 保持隐藏您的 IP 地址

    Super Hide IP 3.4.7.8 转自:http://www.0daydown.com/04/695.html Super Hide IP允许您以匿名方式进行网上冲浪. 保持隐藏您的 IP ...

  6. JDK和Jython安装

    下载JAVA SE,下载地址请到oracle官方网站下载. JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...

  7. Python操作Excel——win32com模块和xlrd+xlwt+xlutils组合

    今天,接到一个任务,要生成大约两百个excel文件,从2006年到2013年,每个月两个文件,这些文件中除了几个关于日期的单元格不同外,其他数据都相同,所以就想到可以用python写一个小脚本,自动生 ...

  8. SQL sum case when then else【转】

    数据库 t 表     b 表内容        Id        Name      胜负        1          张三     胜        2          李四     ...

  9. SQL常用命令浅析

    表操作备注:操作之前使用“use <数据库名>”应连接某个数据库.建表命令:create table <表名> (<字段名 1> <类型 1> [,.. ...

  10. ionic+angulajs

    基于ionic+angulajs的混合开发实现地铁APP 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一.项目简介 在该项目中的地铁app是基于io ...