2843: 极地旅行社

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 323  Solved: 218
[Submit][Status][Discuss]

Description

不久之前,Mirko建立了一个旅行社,名叫“极地之梦”。这家旅行社在北极附近购买了N座冰岛,并且提供观光服务。当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间。
Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。
这些冰岛从1到N标号。一开始时这些岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的。每座岛上的企鹅数量虽然会有所改变,但是始终在[0, 1000]之间。
你的程序需要处理以下三种命令:
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连通,你的程序需要输出这个旅行团一路上所能看到的帝企鹅数量(包括起点A与终点B),若不联通,你的程序需要输出"impossible"。

Input

第一行一个正整数N,表示冰岛的数量。

第二行N个范围[0, 1000]的整数,为每座岛屿初始的帝企鹅数量。

第三行一个正整数M,表示命令的数量。

接下来M行即命令,为题目描述所示。

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

1<=N<=30000

1<=M<=100000

Source

1180: [CROATIAN2009]OTOCI

Time Limit: 50 Sec  Memory Limit: 162 MB
Submit: 795  Solved: 493
[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

Solution

很简单的LCT,支持三种操作,合并,查询区间和,单点修改

合并操作没什么可说的,可以开个并查集维护一下联通性,当然直接用LCT里的find函数也可以

查询区间和,同样,维护一个sum即可

单点修改很简单,修改val后access,splay一下更新一下值即可

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. int read()
  8. {
  9. int x=,f=; char ch=getchar();
  10. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  11. while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
  12. return x*f;
  13. }
  14. #define N 50000
  15. #define M 100010
  16. int fa[N],son[N][],s[N],val[N],size[N],sum[N];
  17. bool rev[N];int father[N];int n,m;
  18. inline void init(){for (int i=; i<=n; i++) father[i]=i;}
  19. inline int find(int x){if (x==father[x]) return x; return father[x]=find(father[x]);}
  20. inline void merge(int x,int y) {int fx=find(x),fy=find(y); if (fx!=fy) father[fx]=fy;}
  21. //bing cha ji
  22. inline bool is_root(int x){return !fa[x]||son[fa[x]][]!=x&& son[fa[x]][]!=x;}
  23. inline void rev1(int x){if (!x)return; swap(son[x][],son[x][]);rev[x]^=;}
  24. void pb(int x){if (rev[x]) rev1(son[x][]),rev1(son[x][]),rev[x]=;}
  25. inline void update(int x)
  26. {
  27. sum[x]=val[x];
  28. if (son[x][]) sum[x]+=sum[son[x][]];
  29. if (son[x][]) sum[x]+=sum[son[x][]];
  30. size[x]=size[son[x][]]++size[son[x][]];
  31. }
  32. inline void rotate(int x)
  33. {
  34. int y=fa[x],w=son[y][]==x;son[y][w]=son[x][w^];
  35. if (son[x][w^]) fa[son[x][w^]]=y;
  36. if (fa[y])
  37. {
  38. int z=fa[y];if (son[z][]==y) son[z][]=x;
  39. else if (son[z][]==y) son[z][]=x;
  40. }
  41. fa[x]=fa[y]; fa[y]=x; son[x][w^]=y; update(y);
  42. }
  43. inline void splay(int x)
  44. {
  45. int top=,i=x,y; s[]=i;
  46. while (!is_root(i)) s[++top]=i=fa[i];
  47. while (top) pb(s[top--]);
  48. while (!is_root(x))
  49. {
  50. y=fa[x];
  51. if (!is_root(y))
  52. if ((son[fa[y]][]==y)^(son[y][]==x)) rotate(x);else rotate(y);
  53. rotate(x);
  54. }
  55. update(x);
  56. }
  57. inline void access(int x){for (int y=; x; y=x,x=fa[x])splay(x),son[x][]=y,update(x);}
  58. inline void makeroot(int x){access(x),splay(x),rev1(x);}
  59. inline void link(int x,int y){makeroot(x); fa[x]=y; access(x);}
  60. inline void cutf(int x){access(x),splay(x);fa[son[x][]]=; son[x][]=; update(x);}
  61. inline void cut(int x,int y){makeroot(x); cutf(y);}
  62. inline void split(int x,int y){makeroot(x);access(y);splay(y);}
  63. inline int ask(int x,int y){split(x,y);return sum[y];}
  64. //Link Cut Tree
  65. void excursion(int x,int y)
  66. {
  67. int f1=find(x),f2=find(y);
  68. if (f1!=f2) {puts("impossible");return;}
  69. printf("%d\n",ask(x,y));
  70. }
  71. void bridge(int x,int y)
  72. {
  73. int f1=find(x),f2=find(y);
  74. if (f1==f2) {puts("no");return;}
  75. link(x,y); merge(x,y); puts("yes");
  76. }
  77. void penguins(int x,int y)
  78. {
  79. val[x]=y; access(x); splay(x);
  80. }
  81. int main()
  82. {
  83. n=read();
  84. for (int i=; i<=n; i++)
  85. val[i]=read(),sum[i]=val[i];
  86. m=read(); init();
  87. for (int i=; i<=m; i++)
  88. {
  89. char opt[]; scanf("%s",opt); int x=read(),y=read();
  90. switch (opt[])
  91. {
  92. case 'e': excursion(x,y);break;
  93. case 'b': bridge(x,y);break;
  94. case 'p': penguins(x,y);break;
  95. }
  96. }
  97. return ;
  98. }

一开始没仔细看,还打了个标记?...然后样例就错了最后一个询问...一看题,单点修改...改后1A...跑得比西方记者还快!

【BZOJ-2843&1180】极地旅行社&OTOCI Link-Cut-Tree的更多相关文章

  1. [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree)

    [BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一 ...

  2. 【BZOJ 2843】极地旅行社

    复习一下$LinkCutTree$的模板. #include<cstdio> #include<cstring> #include<algorithm> #defi ...

  3. link cut tree 入门

    鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...

  4. Link Cut Tree学习笔记

    从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...

  5. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题

    A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...

  6. Link/cut Tree

    Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...

  7. 洛谷P3690 Link Cut Tree (模板)

    Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...

  8. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  9. bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

随机推荐

  1. 集合框架学习笔记<三>

    一些重要的区别 set与list的区别: set是无索引的,list是有索引的: ArrayList与LinkList的区别: 前者是基于数组实现的,后者是基于链表实现的: 两者的使用方法一样,但是在 ...

  2. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. ASP.NET MVC+WCF+NHibernate+Autofac 框架组合(一)

    学习了Spring.NET+NHibernate的框架,觉得Spring.NET框架不够轻量,配置来配置去的比较头疼,所以把Spring.NET换成了Autofac框架,同时加入WCF框架整了一个组合 ...

  4. 基于jsp的文件上传和下载

    参考: 一.JavaWeb学习总结(五十)--文件上传和下载 此文极好,不过有几点要注意: 1.直接按照作者的代码极有可能listfile.jsp文件中 <%@taglib prefix=&qu ...

  5. SpringMVC重定向视图RedirectView小分析

    目录 前言 RedirectView介绍 实例讲解 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnbl ...

  6. silverlight 双击事件

    silverlight的一些功能真让我感到惊奇 就拿双击事件来说一下 写一个简单的例子 <StackPanel x:Name="st_De" MouseLeftButtonD ...

  7. php检测php.ini是否配制正确

    运行命令行 php -d display_startup_errors=1 -d error_reporting=-1 -d display_errors -c "C:\path-to-ph ...

  8. 第十课:CSS选择器的介绍和区分

    IE7以及以下版本: getElementById是不区分表单元素ID与Name的,因此如果有一个表单元素只定义name,并与我们的目标元素ID同名,并且我们的目标元素在它的后面,那么就会选择到那个表 ...

  9. Day10

    会议讨论 628:今天是冲刺的最后一天了,好紧张好激动,我们组还有好些个功能没实现呢,感觉崩崩哒!还要实现选择不同的专业导入不同的课表呢. 601:在修改教师帐号信息的页面要有当密码格式.用户名格式等 ...

  10. Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG]

    Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG] <ignore_js_op> 程序员文本编辑器 Sublime Tex ...