不久之前,Mirko建立了一个旅行社,名叫“极地之梦”。这家旅行社在北极附近购买了N座冰岛,并且提供观光服
务。当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间。Mirko的旅行社遭受一次
重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。Mirko希望
开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。这些冰岛从1到N标号。一开始时这些
岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的。每座岛上的企鹅数量虽然会有所改变,但是始终在[
, ]之间。你的程序需要处理以下三种命令:
."bridge A B"——在A与B之间建立一座大桥(A与B是不同的岛屿)。由于经费限制,这项命令被接受,当且仅当
A与B不联通。若这项命令被接受,你的程序需要输出"yes",之
后会建造这座大桥。否则,你的程序需要输出"no"。
."penguins A X"——根据可靠消息,岛屿A此时的帝企鹅数量变为X。这项命令只是用来提供信息的,你的程序不
需要回应。
."excursion A B"——一个旅行团希望从A出发到B。若A与B连通,你的程序需要输出这个旅行团一路上所能看到的
帝企鹅数量(包括起点A与终点B),若不联通,你的程序需要输出"impossible"。
Input
第一行一个正整数N,表示冰岛的数量。
第二行N个范围[, ]的整数,为每座岛屿初始的帝企鹅数量。
第三行一个正整数M,表示命令的数量。接下来M行即命令,为题目描述所示。
<=N<=,<=M<=
Output
对于每个bridge命令与excursion命令,输出一行,为题目描述所示。 Sample Input excursion
excursion
bridge
excursion
bridge
bridge
excursion
bridge
excursion
excursion
Sample Output impossible
yes yes
yes yes

题意:给定N个岛屿,每个岛屿有初始数量的企鹅。现在有如下三种操作:

      1.    "bridge A B"——----在A与B之间建立一座大桥(A与B是不同的岛屿)。如果A、B连通,输出"yes",且建造这座大桥。否则,输出"no"。
      2.    "penguins A X"——岛屿A此时的帝企鹅数量变为X。
      3.    "excursion A B"——若A与B连通,输出路线上帝企鹅数量(包括起点A与终点B);否则,输出"impossible"。

思路:好像没什么可以说的,毕竟同样是基础题,而前面已经详细地解释过了。

唯一需要注意的是:

access的时候也需要update:

因为这里和单纯的平衡树题统链上信息不同,这里access函数会使原树变化(即splay树也相应变化),所以update的值相应变化。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
int val[maxn];
struct LCT
{
int sum[maxn],rev[maxn],ch[maxn][],fa[maxn],stc[maxn],top;
int isroot(int x){
return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;
}
int get(int x){
return ch[fa[x]][]==x;
}
void pushdown(int x)
{
if(!rev[x]||!x) return ;
swap(ch[x][],ch[x][]);
if(ch[x][]) rev[ch[x][]]^=;
if(ch[x][]) rev[ch[x][]]^=;
rev[x]=;
}
void pushup(int x)
{
sum[x]=val[x];
if(ch[x][]) sum[x]+=sum[ch[x][]];
if(ch[x][]) sum[x]+=sum[ch[x][]];
}
void rotate(int x)
{
int old=fa[x],fold=fa[old],opt=get(x);
if(!isroot(old)) ch[fold][get(old)]=x;
fa[x]=fold;
ch[old][opt]=ch[x][opt^]; fa[ch[old][opt]]=old;
ch[x][opt^]=old; fa[old]=x;
pushup(old); pushup(x);
}
void splay(int x)
{
int top=; stc[++top]=x;
for(int i=x;!isroot(i);i=fa[i]) stc[++top]=fa[i];
for(int i=top;i;i--) pushdown(stc[i]);
for(int f;!isroot(x);rotate(x)){
if(!isroot(f=fa[x]))
rotate(get(x)==get(f)?f:x);
}
}
void access(int x)
{
int rson=;
for(;x;rson=x,x=fa[x]){
splay(x);
ch[x][]=rson;
pushup(x);
}
}
int find(int x){ access(x); splay(x); while(ch[x][]) x=ch[x][]; return x;}
void change(int a,int x){ val[a]=x; access(a); splay(a); }
int query(int x,int y) { make_root(y); access(x); splay(x); return sum[x]; }
void make_root(int x) { access(x); splay(x); rev[x]^=; }
void link(int x,int y) { make_root(x); fa[x]=y; splay(x); }
}S;
int main()
{
int N,M,a,b; char opt[];
scanf("%d",&N);
for(int i=;i<=N;i++) scanf("%d",&val[i]);
scanf("%d",&M);
while(M--){
scanf("%s%d%d",opt,&a,&b);
if(opt[]=='b'){
if(S.find(a)!=S.find(b)){
printf("yes\n");
S.link(a,b);
}
else printf("no\n");
}
if(opt[]=='p') S.change(a,b);
if(opt[]=='e'){
if(S.find(a)!=S.find(b)) printf("impossible\n");
else printf("%d\n",S.query(a,b));
}
}
return ;
}

BZOJ2843:极地旅行社(LCT入门题)的更多相关文章

  1. BZOJ2843 极地旅行社 LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2843 题意概括 有n座岛 每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间.你的 ...

  2. bzoj2843极地旅行社

    bzoj2843极地旅行社 题意: 一些点,每个点有一个权值.有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法) 题解: 以前一直想不通为什么神犇们的模板中LCT在 ...

  3. [bzoj2843&&bzoj1180]极地旅行社 (lct)

    双倍经验双倍的幸福... 所以另一道是300大洋的世界T_T...虽然题目是一样的,不过2843数据范围小了一点... 都是lct基本操作 #include<cstdio> #includ ...

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

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

  5. BZOJ2843: 极地旅行社

    2843: 极地旅行社 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 90  Solved: 56[Submit][Status] Descripti ...

  6. BZOJ 2843: 极地旅行社( LCT )

    LCT.. ------------------------------------------------------------------------ #include<cstdio> ...

  7. BZOJ2843——极地旅行社

    1.题目大意:动态树问题,点修改,链查询.另外说明双倍经验题=bzoj1180 2.分析:lct模板题,练手的 #include <stack> #include <cstdio&g ...

  8. BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)

    emmm-标题卡着长度上限- LCT板题-(ε=ε=ε=┏(゜ロ゜;)┛) CODE #include <cctype> #include <cmath> #include & ...

  9. 【bzoj2843】极地旅行社 LCT

    题目描述 不久之前,Mirko建立了一个旅行社,名叫“极地之梦”.这家旅行社在北极附近购买了N座冰岛,并且提供观光服务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间.Mir ...

随机推荐

  1. CodeForces230A

    题目大意: 一个打恐龙的游戏,有初始体力s,和恐龙n只,然后输入n只恐龙的体力xi,和击杀它得到的奖励体力yi,只有自身体力大于恐龙体力时才能进行击杀,击杀恐龙的顺序可以不定 这题运用到了贪心的思想, ...

  2. MTK android 重启测试脚本

    @echo off set reboot_time=0 :start call adb -s 0123456789ABCDEF reboot set DATESTAMP=%DATE% set TIME ...

  3. 使用WaveOut API播放WAV音频文件(解决卡顿)

    虽然waveout已经过时,但是其api简单,有些时候也还是需要用到. 其实还是自己上msdn查阅相应api最靠谱,waveout也有提供暂停.设置音量等接口的,这里给个链接,需要的可以自己查找: h ...

  4. HDU 4436 (后缀自动机)

    HDU 4436 str2int Problem : 给若干个数字串,询问这些串的所有本质不同的子串转换成数字之后的和. Solution : 首先将所有串丢进一个后缀自动机.由于这道题询问的是不同的 ...

  5. C++内存分配方式(——选自:C++内存管理技术内幕)

    C++内存分配的区: 1.栈:程序运行时分配的,局部变量,以及传入的参数等存储的地方,在程序结束的时候会回收 2.堆:new分配,由delete释放 3.自由存储区:malloc分配 4.全局/静态存 ...

  6. Codeforces 559A(计算几何)

    A. Gerald's Hexagon time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. 学习日常笔记<day13>jsp加强

    1.jsp的内置对象(重点) 1.1什么是内置对象? 在jsp开发中,会频繁使用到一些现象 例如HttpSession,ServletContext,ServletContext,HttpServle ...

  8. Spring Boot中使用logback日志框架

    说明:Spring Boot在最新的版本中默认使用了logback框架.一般来说使用时只需在classpath下创建logback.xml即可,而官方推荐使用logback-spring.xml替代, ...

  9. rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnec

    在mysql5中,可以设置safe mode,比如在一个更新语句中 UPDATE table_name SET bDeleted=0; 执行时会错误,报: You are using safe upd ...

  10. Eclipse中Maven运行项目时在Console中无日志出现的问题解决

    这是由于工作空间损坏造成的,比如重装JDK后,或者重装Maven后这些问题.解决方法如下: 1.删除现有工作空间,重新选择一个新的. 2.重置Workspece. 3.可能是Maven版本太新导致的, ...