题目

给出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。

输入格式

第一行包含一个整数n(1<=n<=30000),表示节点的数目。第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。第三行包含一个整数q(1<=n<=300000),表示操作的数目。以下q行,每行包含一个操作,操作的类别见题目描述。任意时刻每个节点对应的权值都是1到1000的整数。

输出格式

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

输入样例

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

输出样例

4

impossible

yes

6

yes

yes

15

yes

15

16

题解

LCT板题

但蒟蒻opt[0]打成了opt[1]查了一个中午QAQ

对着黄学长代码还是学会了更加简化的LCT代码

没白弄

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define LL long long int
  5. #define REP(i,n) for (int i = 1; i <= (n); i++)
  6. #define isrt(u) !(e[e[u].f].ch[0] == u || e[e[u].f].ch[1] == u)
  7. #define isr(u) (e[e[u].f].ch[1] == u)
  8. #define ls e[u].ch[0]
  9. #define rs e[u].ch[1]
  10. using namespace std;
  11. const int maxn = 30005,maxm = 100005,INF = 1000000000;
  12. inline int RD(){
  13. int out = 0,flag = 1; char c = getchar();
  14. while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
  15. while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
  16. return out * flag;
  17. }
  18. int N,M;
  19. char opt[20];
  20. struct node{int f,ch[2],w,sum,rev;}e[maxn];
  21. void pup(int u){e[u].sum = e[ls].sum + e[u].w + e[rs].sum;}
  22. void pd(int u){
  23. if (e[u].rev){
  24. swap(ls,rs);
  25. e[ls].rev ^= 1; e[rs].rev ^= 1; e[u].rev ^= 1;
  26. }
  27. }
  28. void push_down(int u){
  29. if (!isrt(u)) push_down(e[u].f);
  30. pd(u);
  31. }
  32. void spin(int u){
  33. int s = isr(u),fa = e[u].f;
  34. e[u].f = e[fa].f; if (!isrt(fa)) e[e[fa].f].ch[isr(fa)] = u;
  35. e[fa].ch[s] = e[u].ch[s ^ 1]; if (e[u].ch[s ^ 1]) e[e[u].ch[s ^ 1]].f = fa;
  36. e[fa].f = u; e[u].ch[s ^ 1] = fa;
  37. pup(fa); pup(u);
  38. }
  39. void splay(int u){
  40. push_down(u);
  41. for (; !isrt(u); spin(u))
  42. if (!isrt(e[u].f)) spin((isr(u) ^ isr(e[u].f)) ? u : e[u].f);
  43. }
  44. void Access(int u){
  45. for (int v = 0; u; u = e[v = u].f)
  46. splay(u),e[u].ch[1] = v,pup(u);
  47. }
  48. void Make_root(int u){Access(u); splay(u); e[u].rev ^= 1;}
  49. int Getrt(int u){
  50. Access(u); splay(u);
  51. while (ls) u = ls;
  52. return u;
  53. }
  54. void Link(int u,int v){
  55. Make_root(u); e[u].f = v;
  56. }
  57. int Getsum(int u,int v){
  58. Make_root(u); Access(v); splay(v);
  59. return e[v].sum;
  60. }
  61. void solve1(int u,int v){
  62. if (Getrt(u) == Getrt(v)) puts("no");
  63. else puts("yes"),Link(u,v);
  64. }
  65. void solve2(int u,int v){
  66. Make_root(u);
  67. e[u].w = v; pup(u);
  68. }
  69. void solve3(int u,int v){
  70. if (Getrt(u) == Getrt(v)) printf("%d\n",Getsum(u,v));
  71. else puts("impossible");
  72. }
  73. int main(){
  74. N = RD(); REP(i,N) e[i].w = e[i].sum = RD();
  75. M = RD(); int u,v;
  76. while (M--){
  77. scanf("%s",opt); u = RD(); v = RD();
  78. if (opt[0] == 'b') solve1(u,v);
  79. else if (opt[0] == 'p') solve2(u,v);
  80. else solve3(u,v);
  81. }
  82. return 0;
  83. }

BZOJ1180 [CROATIAN2009]OTOCI 【LCT】的更多相关文章

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

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

  2. 【BZOJ2049】【LCT】Cave 洞穴勘测

    Description 辉 辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通 道组成,并且每条通道连接了 ...

  3. 【HDU4010】【LCT】Query on The Trees

    Problem Description We have met so many problems on the tree, so today we will have a query problem ...

  4. 1180: [CROATIAN2009]OTOCI(LCT)

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

  5. BZOJ1180 [CROATIAN2009]OTOCI LCT

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

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

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

  7. ZJOI2012网络 题解报告【LCT】

    题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...

  8. BZOJ2631 tree 【LCT】

    题目 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原有的边( ...

  9. [BZOJ 3669] [Noi2014] 魔法森林 【LCT】

    题目链接:BZOJ - 3669 题目分析 如果确定了带 x 只精灵A,那么我们就是要找一条 1 到 n 的路径,满足只经过 Ai <= x 的边,而且要使经过的边中最大的 Bi 尽量小. 其实 ...

随机推荐

  1. python逻辑运算(not,and,or)总结

    逻辑运算 1.在没有()的情况下not优先级高于and,and优先级高于or,即优先级关系为()>not>and>or,同一优先级从左往右计算 总结:a or b : 如果a = 0 ...

  2. pip命令小结

    pip的另一种调用方式 python -m pip通过指定python的名字来指定特定的pip pip freeze > 项目目录/requirements.txt导出pip中下载的包目录 pi ...

  3. C#爬虫实践

    忘了什么时候加的,iPad上的人人视频追剧了<我的天才女友>,没事的时候看了下,感觉还不错,进一步了解到原著那不勒斯四部曲,感觉视频进度有些慢,就想找找书看看,一时没找到[PS:购买实体书 ...

  4. 海龟绘图turtle模块的使用

    在本章中,我们将编写简短的.简单的程序来创建漂亮的.复杂的视觉效果.为了做到这一点,我们可以使用海龟作图软件.在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动.这个海龟带着一 ...

  5. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...

  6. Python学习-django-Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  7. Requests库:python实现的简单易用的http库

    1.get请求: get(url, params, headers) 2.json 解析 3.content 获取二进制内容 4.headers 添加 5.post请求:post(url,data,h ...

  8. openwrt(三) 固件的烧录

    导航: 方法1: tftp: 方法2: 在线升级 方法3: BIOS烧录 方法1:TFTP 这应该是最万能的一种方法了.TFTP是一种依靠网口传送数据的一种通信协议,没错,只是传输数据,并不是烧录,所 ...

  9. 笔记-select,poll,epoll

    笔记-select,poll,epoll 1.      I/O多路复用 I/O多路复用是指:通过一种机制或一个进程,可以监视多个文件描述符,一旦描述符就绪(写或读),能够通知程序进行相应的读写操作. ...

  10. 文档-linux io模式及select,poll,epoll

    文档-Linux IO模式详解 1. 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 1.1 用户空间与内核空间 现在操作 ...