[bzoj3123]森林
首先对于询问操作可以使用可持久化线段树来维护,对于连边操作对于两颗树中选取较小的树暴力练到另一个点上,点数可以用并查集然后只修改根的点数即可。
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define mid (l+r>>1)
4 #define N 100001
5 struct ji{
6 int nex,to;
7 }edge[N<<1];
8 int E,V,n,m,t,x,y,z,ans,a[N],ff[N],sum[N],f[21][N],head[N],sz[20*N],b[N],son[2][20*N],s[N],r[N],vis[N];
9 char s1[11];
10 void add(int x,int y){
11 edge[E].nex=head[x];
12 edge[E].to=y;
13 head[x]=E++;
14 }
15 int find(int k){
16 if (k==ff[k])return k;
17 return ff[k]=find(ff[k]);
18 }
19 int ne(int &k){
20 if (!k)k=++V;
21 return k;
22 }
23 int lca(int x,int y){
24 if (s[x]<s[y])swap(x,y);
25 for(int i=20;i>=0;i--)
26 if (s[f[i][x]]>=s[y])x=f[i][x];
27 if (x==y)return x;
28 for(int i=20;i>=0;i--)
29 if (f[i][x]!=f[i][y]){
30 x=f[i][x];
31 y=f[i][y];
32 }
33 return f[0][x];
34 }
35 void merge(int x,int y){
36 ff[find(x)]=find(y);
37 sum[find(y)]+=sum[find(x)];
38 }
39 void update(int k1,int k2,int l,int r,int x){
40 sz[k1]=sz[k2]+1;
41 if (l==r)return;
42 int p=(x>mid);
43 son[p^1][k1]=son[p^1][k2];
44 update(ne(son[p][k1]),son[p][k2],l+(mid-l+1)*p,mid+(r-mid)*p,x);
45 }
46 int query(int l,int r,int x,int a,int b,int c,int d){
47 if (l==r)return l;
48 int t=sz[son[0][a]]+sz[son[0][b]]-sz[son[0][c]]-sz[son[0][d]],p=(x>t);
49 return query(l+(mid-l+1)*p,mid+(r-mid)*p,x-p*t,son[p][a],son[p][b],son[p][c],son[p][d]);
50 }
51 void dfs(int k,int fa){
52 vis[k]=1;
53 s[k]=s[f[0][k]=fa]+1;
54 for(int i=1;i<=20;i++)f[i][k]=f[i-1][f[i-1][k]];
55 update(ne(r[k]),r[fa],1,m,a[k]);
56 for(int i=head[k];i!=-1;i=edge[i].nex)
57 if (edge[i].to!=fa)dfs(edge[i].to,k);
58 }
59 int main(){
60 scanf("%*d%d%d%d",&n,&m,&t);
61 memset(head,-1,sizeof(head));
62 for(int i=1;i<=n;i++){
63 scanf("%d",&a[i]);
64 ff[i]=i;
65 sum[i]=1;
66 }
67 for(int i=1;i<=m;i++){
68 scanf("%d%d",&x,&y);
69 add(x,y);
70 add(y,x);
71 merge(x,y);
72 }
73 memcpy(b,a,sizeof(b));
74 sort(b+1,b+n+1);
75 m=unique(b+1,b+n+1)-b-1;
76 for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+m+1,a[i])-b;
77 for(int i=1;i<=n;i++)
78 if (!vis[i])dfs(i,0);
79 while (t--){
80 scanf("%s%d%d",s1,&x,&y);
81 x^=ans;
82 y^=ans;
83 if (s1[0]=='Q'){
84 scanf("%d",&z);
85 printf("%d\n",ans=b[query(1,m,z^ans,r[x],r[y],r[lca(x,y)],r[f[0][lca(x,y)]])]);
86 }
87 if (s1[0]=='L'){
88 if (sum[find(x)]>sum[find(y)])swap(x,y);
89 add(x,y);
90 add(y,x);
91 merge(x,y);
92 dfs(x,y);
93 }
94 }
95 }
[bzoj3123]森林的更多相关文章
- 【BZOJ3123】森林(主席树,启发式合并)
题意:一个带点权的森林,要求维护以下操作: 1.询问路径上的点权K大值 2.两点之间连边 n,m<=80000 思路:如果树的结构不发生变化只需要维护DFS序 现在因为树的结构发生变化,要将两棵 ...
- 【BZOJ3123】[Sdoi2013]森林 主席树+倍增LCA+启发式合并
[BZOJ3123][Sdoi2013]森林 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整 ...
- [bzoj3123][Sdoi2013]森林_主席树_启发式合并
森林 bzoj-3123 Sdoi-2013 题目大意:给定一片共n个点的森林,T个操作,支持:连接两个不在一棵树上的两个点:查询一棵树上路径k小值. 注释:$1\le n,T \le 8\cdot ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- [BZOJ3123][Sdoi2013]森林 主席树+启发式合并
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MB Description Input 第一行包含一个正整数testcase,表示当 ...
- 【BZOJ-3123】森林 主席树 + 启发式合并
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 806[Submit][Status] ...
- BZOJ3123: [Sdoi2013]森林(启发式合并&主席树)
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4813 Solved: 1420[Submit][Status ...
- 【BZOJ3123】[SDOI2013] 森林(启发式合并主席树)
点此看题面 大致题意: 给你一片森林,有两种操作:询问两点之间的第\(k\)小点权和在两棵树之间连一条边. 前置技能:树上主席树 做这道题目,我们首先要会树上主席树. 关于树上主席树,这有一道很好的例 ...
- 【主席树 启发式合并】bzoj3123: [Sdoi2013]森林
小细节磕磕碰碰浪费了半个多小时的时间 Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M ...
随机推荐
- C++核心编程 4 类和对象-封装
C++面向对象的三大特性:封装.继承.多态 C++认为万事万物皆为对象,对象上有其属性和行为 封装 意义:1.将属性和行为作为一个整体,表现生活中的事物 语法: class 类名{ 访问权限:属性 ...
- WinForm 控件 DataGridView 常用操作
1.取消列自动生成 在窗体load事件里面设置表格dataGridView的AutoGenerateColumns为 false dataGridView.AutoGenerateColumns = ...
- 高级爬虫面试题测试题 v1.3
Python Web高级爬虫工程师测试题 (请本文件发送到: SpiderTestQuestion@163.com 并附带简历) 1. 用yield写一个斐波那契数列的生成器函数. 2. 放一段scr ...
- 题解 Weak in the Middle
题目传送门 Description 有一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\) ,每次可以删掉 \(a_i\),当 \(\min(a_{i-1},a_{i+1})>a_ ...
- res目录下的结构
目录 res目录下的结构 drawable开头的文件夹 mipmap开头的文件夹 values开头的文件夹 layout文件夹 使用res目录下的资源 res目录下的结构 如果你展开res目录看一下, ...
- pycharm安装pika提示CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com>
1. 问题描述: pycharm安装第三方库时提示CondaHTTPError: HTTP 000 CONNECTION FAILED. 2. 错误原因:默认镜像源访问速度过慢,会导致超时从而导致更新 ...
- javascript高级程序设计第三版书摘
在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...
- Noip模拟40 2021.8.15
T1 送花 按照题解意思说是扫描线题,但我觉得像一个线段树优化$dp$ 主要思想一样,就是暴力枚举右端点,同时维护左端点的最值, 考虑两种情况, 如果左端点在$r$扫到的数$i$上一次出现的位置之前, ...
- Python课程笔记(七)
今天学习神奇的海龟,非常有意思,还有很多图片想去绘制,分享一个turtle绘图网站: https://www.python123.io/index/turtles/latest , 要是可以分享出源码 ...
- Spring的Ioc与DI
一.前言 Spring框架的核心基于控制反转的原理. IoC是一种将组件依赖关系的创建和管理外部化的技术. 考虑一个示例,其中Foo类依赖于Bar类的实例来执行某种处理. 传统上,Foo使用new运算 ...