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

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

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

bridge u v:询问结点 uu 与结点 vv 是否连通。如果是则输出 no;否则输出 yes,并且在结点 uu 和结点 vv 之间连一条无向边。
penguins u x:将结点 uu 对应的权值 w_uw
u

修改为 xx。
excursion u v:如果结点 uu 和结点 vv 不连通,则输出 impossible。否则输出结点 uu 到结点 vv 的路径上的点对应的权值的和。
共有 qq 个操作。

输入格式
第一行包含一个整数 nn,表示节点的数目。

第二行包含 nn 个整数,第 ii 个整数表示第 ii 个节点初始时的权值 w_iw
i

第三行包含一个整数 qq,表示操作的数目。

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

输出格式
输出所有 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


两种做法,离线建图再树剖,或者直接LCT。

后者更简单,直接暴力LCT即可,维护链上和。

由于LCT的findroot常数比较大,而且这道题没有cut操作,所以我们直接并查集find即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
#define ls(x) t[x].ch[0]
#define rs(x) t[x].ch[1]
const int N=1e5+10;
int cnt,st[N],n,q,a[N],f[N];
struct node{int ch[2],fa,re,val;
}t[N];
inline void push_up(int p){t[p].val=t[ls(p)].val+t[rs(p)].val+a[p];
}
inline void push_re(int p){swap(ls(p),rs(p)); t[p].re^=1;}
inline void push_down(int p){if(!t[p].re)   return;if(ls(p))    push_re(ls(p)); if(rs(p))   push_re(rs(p)); t[p].re^=1;
}
inline bool isroot(int x){return ls(t[x].fa)!=x&&rs(t[x].fa)!=x;}
inline void rotate(int x){int y=t[x].fa,z=t[y].fa,k=rs(y)==x,w=t[x].ch[!k];if(!isroot(y)) t[z].ch[rs(z)==y]=x; t[x].ch[!k]=y; t[y].ch[k]=w;if(w) t[w].fa=y; t[y].fa=x; t[x].fa=z; push_up(y);
}
inline void splay(int x){cnt=1;    st[cnt]=x; int y=x;while(!isroot(y))  st[++cnt]=y=t[y].fa;while(cnt)  push_down(st[cnt--]);while(!isroot(x)){int y=t[x].fa,z=t[y].fa;if(!isroot(y)) rotate((ls(y)==x)^(ls(z)==y)?x:y); rotate(x);}push_up(x);
}
inline void access(int x){for(int y=0;x;x=t[y=x].fa) splay(x),rs(x)=y,push_up(x);
}
inline void makeroot(int x){access(x); splay(x); push_re(x);
}
inline void split(int x,int y){makeroot(x); access(y); splay(y);
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
inline void link(int x,int y){makeroot(x);  t[x].fa=y;
}
signed main(){cin>>n;for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=i;cin>>q;   char op[15]; int x,y;while(q--){scanf("%s %d %d",op,&x,&y);if(op[0]=='b'){int fx=find(x),fy=find(y);if(fx==fy)    puts("no");else   puts("yes"),link(x,y),f[fx]=fy;}else if(op[0]=='p'){splay(x);    a[x]=y;}else{int fx=find(x),fy=find(y);if(fx!=fy)   puts("impossible");else   split(x,y),printf("%d\n",t[y].val);}}return 0;
}

[COCI 2009] OTOCI / 极地旅行社相关推荐

  1. bzoj2843极地旅行社题解

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

  2. bzoj2843极地旅行社

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

  3. BZOJ2843 - 极地旅行社

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

  4. BZOJ2843:极地旅行社

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

  5. bzoj 2843: 极地旅行社

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

  6. 极地旅行社[LCT]

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

  7. 2843: 极地旅行社

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

  8. BZOJ2843: 极地旅行社

    [传送门:BZOJ2843] 简要题意: 给出n个点以及它们的权值,有m个操作,4种操作: 1.询问从x到y的路径上的权值和,如果不连通则输出impossible 2.连接x和y,如果本来就联通则输出 ...

  9. 【bzoj2223】[Coci 2009]PATULJCI 主席树

    题目描述 样例输入 10 3 1 2 1 2 1 2 3 2 3 3 8 1 2 1 3 1 4 1 5 2 5 2 6 6 9 7 10 样例输出 no yes 1 no yes 1 no yes ...

最新文章

  1. 一文读懂支持向量机SVM(附实现代码、公式)
  2. hibernate小记
  3. Oracle常用操作之登录名和密码大小写问题
  4. 密码技术--对称加密算法及Go语言应用
  5. Windows Mobile系列手机操作系统
  6. 基于Hbase的用户评分协同过滤推荐算法
  7. 【ArcGIS风暴】什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘
  8. Linux Linux程序练习七
  9. void start_kernel(void)分析 ! \linux-1.0\init\main.c
  10. stm32 输入捕获 测量脉宽
  11. Comet4J推技术在SSHE三大框架中应用-linux下亲测可用
  12. 使用React搭建初始化环境(React入门)
  13. C# 委托事件传递参数
  14. 博士招生 | 北京大学和中山大学博士申请考核还有名额,门槛不高,速来
  15. Java class反编译工具
  16. 焊接工时简便计算工具_焊接工时计算表
  17. 机器学习(周志华) 第七章贝叶斯分类器
  18. 微信小程序吸顶容器sticky
  19. 物联网模块的省电方法
  20. 还在想假期去哪玩?直接做一个旅游攻略小程序

热门文章

  1. React - 从0开始学习React
  2. IOS微信浏览器返回事件监听问题
  3. 爬虫 某音海外版用户主页翻页x-tt-params加密参数逆向分析
  4. 用同样的芯片,如何识别出不同的PCI卡?
  5. 【交换篇】11. 按接口划分 VLAN ❀ C3750-E ❀ CISCO 交换机
  6. 太有用了,自己有电脑的不看后悔的
  7. [zt]D语言编译器下载安装和编译参数
  8. 阿里云、盛大云、臻云安全性评测
  9. 你是左脑思考还右脑思考?
  10. credit card fraud detection