题目描述

不久之前,Mirko建立了一个旅行社,名叫“极地之梦”。这家旅行社在北极附近购买了N座冰岛,并且提供观光服务。

当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间。Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。

Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。这些冰岛从1到N标号。一开始时这些岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的。每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间。你的程序需要处理以下三种命令:

  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个操作,要求在线处理所有操作。

输入格式:

第一行包含一个整数n(1<=n<=30000),表示节点的数目。

第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。

第三行包含一个整数q(1<=n<=300000),表示操作的数目。

以下q行,每行包含一个操作,操作的类别见题目描述。

任意时刻每个节点对应的权值都是1到1000的整数。

输出格式:

输出所有bridge操作和excursion操作对应的输出,每个一行。

输入样例#1:

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

输出样例#1:

4
impossible
yes
6
yes
yes
15
yes
15
16

说明

数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。


题意:

Link,单点修改,路径查询

#include<bits/stdc++.h>
#define N 30005
#define lc t[x].ch[0]
#define rc t[x].ch[1]
using namespace std;
int n,q,a[N]; char s[20];
struct Node{int ch[2],fa,tag,val;
}t[N];
int read(){int cnt=0,f=1;char ch=0;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))cnt=cnt*10+(ch-'0'),ch=getchar();return cnt*f;
}
bool isRoot(int x){int fa=t[x].fa; if(fa==0) return true;return t[fa].ch[0]!=x && t[fa].ch[1]!=x;
}
void Pushup(int x){t[x].val = t[lc].val + t[rc].val + a[x];
}
void Pushdown(int x){if(t[x].tag){swap(lc,rc);t[lc].tag^=1,t[rc].tag^=1;t[x].tag=0;}
}
void Pushpath(int x){if(!isRoot(x)) Pushpath(t[x].fa);Pushdown(x);
}
void rotate(int x){int y=t[x].fa,z=t[y].fa;int k=t[y].ch[1]==x;if(!isRoot(y)) t[z].ch[t[z].ch[1]==y]=x;t[x].fa=z;t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].fa=y;t[x].ch[k^1]=y,t[y].fa=x;Pushup(y),Pushup(x);
}
void Splay(int x){Pushpath(x);while(!isRoot(x)){int y=t[x].fa,z=t[y].fa;if(!isRoot(y))(t[y].ch[0]==x)^(t[z].ch[0]==y) ? rotate(x) : rotate(y);rotate(x); }
}
void Access(int x){for(int y=0;x;y=x,x=t[x].fa)Splay(x),rc=y,Pushup(x);
}
void Makeroot(int x){Access(x),Splay(x),t[x].tag^=1;
}
int Findroot(int x){Access(x),Splay(x);while(lc) Pushdown(x),x=lc; return x;
}
void Link(int x,int y){Makeroot(x),t[x].fa=y;
}
int main(){//freopen("1.in","r",stdin);n=read();for(int i=1;i<=n;i++) a[i]=read();q=read();while(q--){scanf("%s",s);int x=read(),y=read();if(s[0]=='e'){Makeroot(x);if(Findroot(y)==x){Access(y),Splay(y);printf("%d\n",t[y].val);} else printf("impossible\n");}if(s[0]=='p'){Access(x),Splay(x),a[x]=y,Pushup(x);}if(s[0]=='b'){if(Findroot(x)==Findroot(y)) printf("no\n");else Link(x,y),printf("yes\n");}}
}

极地旅行社[LCT]相关推荐

  1. BZOJ2843 极地旅行社 LCT

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

  2. bzoj2843极地旅行社题解

    bzoj2843极地旅行社题解 题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出y ...

  3. bzoj2843极地旅行社

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

  4. BZOJ2843 - 极地旅行社

    Portal Description 给出\(n(n\leq3\times10^4)\)个独立的带权顶点,对其进行\(m(m\leq10^5)\)次操作: 连接两个不连通的节点.如果它们已经联通,输出 ...

  5. 【BZOJ28431180】极地旅行社,LCT练习

    传送门-P2843 (1180是权限题,所以就不放了) 写在前面:为什么BZOJ上LCT好多都是权限题(╯‵□′)╯︵┻━┻ 思路:判断联通用findroot函数(洞穴探测里已经说过了):修改x的操作 ...

  6. BZOJ2843:极地旅行社

    Description 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服务. 当地最受欢迎的当然是帝企鹅了,这些小家伙经常 ...

  7. bzoj 2843: 极地旅行社

    Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1077  Solved: 645 [Submit][Status][Discuss] Descrip ...

  8. [COCI 2009] OTOCI / 极地旅行社

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

  9. 2843: 极地旅行社

    Description 不久之前,Mirko建立了一个旅行社,名叫"极地之梦".这家旅行社在北极附近购买了N座冰岛,并且提供观光服 务.当地最受欢迎的当然是帝企鹅了,这些小家伙经常 ...

最新文章

  1. java Excel 导入 IllegalStateException 异常处理 不同的数据类型
  2. 张钹、高文、杨强同台论道“AI精度与隐私的博弈
  3. suse mysql root密码忘记_SUSE11.4 找回 mysql root 密码?网上能找到的所有方法都试过了,不行......
  4. 在子线程中弹土司的一段代码
  5. Java将一段逗号分割的字符串转换成一个数组
  6. python多久学会自学-python自学多久
  7. 线程池ExcutorThreadPool的运行原理
  8. Tensorflow实现自动编码器
  9. linux共享内存与信号量的使用
  10. shell 做加法运算_使用shell脚本实现加法乘法运算
  11. Qt学习笔记-带TCP数据传输的局域网聊天软件
  12. 【SPI】java基础之SPI框架实现
  13. USACO1.1.2 - Greedy Gift Givers
  14. 推荐一个死链检测工具“Xenu”
  15. JAVA企业微信事件接收
  16. Oracle语句优化规则
  17. 常用SEISMIC BINARY数据的读取
  18. EE308_Lab1
  19. 如何评价「仙剑奇侠传六」使用Unity 3D引擎?
  20. 黄聪:黄金分割——设计师的设计利器

热门文章

  1. LaTeX 制作(跨页)长表格
  2. java 改变图片的DPI
  3. Leetcode 猜字谜
  4. Tensorflow2教程-文本卷积
  5. 全排列与逆序数的组合
  6. 踏浪点神:5.21 恒指黄金原油早盘分析及最新资讯
  7. 视频教程-【吴刚大讲堂】视觉设计快速入门50讲-UI
  8. VoIP系统故障排除:7个常见问题处理方法
  9. 基于python+pyqt+halcon实现视觉定位(halcon12.0)【附部分源码】
  10. CSS水平垂直居中常见方法总结(转)