洛谷 P3302 [SDOI2013]森林
题解:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 160001
#define D 15
using namespace std;
char ch[];
int t,x,y,z;
int n,m,qq,tot,cut,ans,father[MAXN],dis[MAXN];
int head[MAXN],size[MAXN],deep[MAXN],root[MAXN],s[MAXN],fa[MAXN][D+];
struct edge {
int v,next;
} e[MAXN*];
struct data {
int lc,rc,size;
} tree[MAXN*];
struct node {
int x,o;
} a[MAXN];
void add(int u,int v) {
e[++cut].v=v;
e[cut].next=head[u];
head[u]=cut;
}
bool cmp(const node &x,const node &y) {
if(x.x==y.x) return x.o<y.o;
return x.x<y.x;
}
int find(int x) {
return x!=father[x]?father[x]=find(father[x]):x;
}
void change(int &k,int last,int l,int r,int x) {
k=++tot;
tree[k].lc=tree[last].lc,tree[k].rc=tree[last].rc;
tree[k].size=tree[last].size+;
if(l==r) return ;
int mid=(l+r)>>;
if(x<=mid) change(tree[k].lc,tree[last].lc,l,mid,x);
else change(tree[k].rc,tree[last].rc,mid+,r,x);
return ;
}
int query(int L,int R,int lc,int falc,int l,int r,int k) {
if(l==r) return l;
int sum=tree[tree[R].lc].size+tree[tree[L].lc].size-
tree[tree[lc].lc].size-tree[tree[falc].lc].size;
int mid=l+r>>;
if(sum>=k)
return query(tree[L].lc,tree[R].lc,tree[lc].lc,tree[falc].lc,l,mid,k);
else return
query(tree[L].rc,tree[R].rc,tree[lc].rc,tree[falc].rc,mid+,r,k-sum);
}
void dfs1(int u,int f) {
size[u]=;
fa[u][]=f;
int p=lower_bound(s+,s+n+,a[u].x)-s;
change(root[u],root[f],,n,p);
for(int i=head[u]; i; i=e[i].next) {
int v=e[i].v;
if(v!=f) deep[v]=deep[u]+,dfs1(v,u),size[u]+=size[v];
}
return ;
}
void get_father() {
for(int j=; j<=D; j++)
for(int i=; i<=n; i++)
fa[i][j]=fa[fa[i][j-]][j-];
return ;
}
int get_same(int u,int x) {
for(int i=; i<=D; i++)
if(x&(<<i)) u=fa[u][i];
return u;
}
int lca(int x,int y) {
if(deep[x]<deep[y]) swap(x,y);
x=get_same(x,deep[x]-deep[y]);
if(x==y) return x;
for(int i=D; i>=; i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][];
}
void slovequery(int x,int y,int k) {
int lc=lca(x,y);
ans=query(root[x],root[y],root[lc],root[fa[lc][]],,n,k);
ans=s[ans];
printf("%d\n",ans);
return ;
}
void slove(int u,int f) {
fa[u][]=f;
deep[u]=deep[f]+;
int p=lower_bound(s+,s+n+,a[u].x)-s;
change(root[u],root[f],,n,p);
for(int i=; i<=D; i++) fa[u][i]=fa[fa[u][i-]][i-];
for(int i=head[u]; i; i=e[i].next) {
int v=e[i].v;
if(v!=f) slove(v,u);
}
return ;
}
void union_(int x,int y) {
int l1=find(x),l2=find(y);
if(size[l1]>size[l2]) swap(l1,l2),swap(x,y);
add(x,y),add(y,x);
father[l1]=l2,size[l1]+=size[l2];
slove(x,y);
return ;
}
int main() {
cin>>t>>n;
cin>>m>>qq;
for(int i=; i<=n; i++)
father[i]=i,cin>>a[i].x,a[i].o=i,s[i]=a[i].x;
sort(s+,s+n+);
for(int i=; i<=m; i++) {
cin>>x>>y,add(x,y),add(y,x);
int l1=find(x),l2=find(y);
father[l2]=l1;
}
for(int i=; i<=n; i++) if(!fa[i][]) dfs1(i,);
get_father();
while(qq--) {
scanf("%s",ch);
if(ch[]=='Q') {
cin>>x>>y>>z;
x^=ans,y^=ans,z^=ans;
slovequery(x,y,z);
} else {
cin>>x>>y;
x^=ans,y^=ans;
union_(x,y);
}
}
return ;
}
一世安宁
洛谷 P3302 [SDOI2013]森林的更多相关文章
- 洛谷 P3302 [SDOI2013]森林 解题报告
P3302 [SDOI2013]森林 题目描述 小\(Z\)有一片森林,含有\(N\)个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有\(M\)条边. 小Z希望执行\(T\)个操作,操 ...
- 洛谷 P3302 [SDOI2013]森林 Lebal:主席树 + 启发式合并 + LCA
题目描述 小Z有一片森林,含有N个节点,每个节点上都有一个非负整数作为权值.初始的时候,森林中有M条边. 小Z希望执行T个操作,操作有两类: Q x y k查询点x到点y路径上所有的权值中,第k小的权 ...
- [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)
传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...
- P3302 [SDOI2013]森林(主席树+启发式合并)
P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...
- [洛谷P3304] [SDOI2013]直径
洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...
- Bzoj3197/洛谷3296 [SDOI2013]刺客信条assassin(树的重心+树Hash+树形DP+KM)
题面 Bzoj 洛谷 题解 (除了代码均摘自喻队的博客,可是他退役了) 首先固定一棵树,枚举另一棵树,显然另一棵树只有与这棵树同构才有可能产生贡献 如果固定的树以重心为根,那么另一棵树最多就只有重心为 ...
- 洛谷$P3302$ 森林 $[SDOI2013]$ 主席树
正解:主席树 解题报告: 传送门! 口胡一时爽代码火葬场 这题想法不难,,,但显然的是代码应该还挺难打的 但反正我也不放代码,就写下题解趴$QwQ$ 第一问就是个$Count\ on\ a\ tree ...
- 洛谷P3302 森林
题意:给定森林,可以把两棵树连起来或者询问链上第k大. 解:启发式合并. 我一开始想到了启发式合并但是发现这样做之后一棵子树就不是一段连续的区间了,那就不能子树xxx了,很迷惘. 后来看了题解发现本来 ...
- 洛谷 P3299 [SDOI2013]保护出题人 解题报告
P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...
随机推荐
- 有关 Azure IaaS VM 磁盘以及托管和非托管高级磁盘的常见问题解答
本文将对有关 Azure 托管磁盘和 Azure 高级存储的一些常见问题进行解答. 托管磁盘 什么是 Azure 托管磁盘? 托管磁盘是一种通过处理存储帐户管理来简化 Azure IaaS VM 的磁 ...
- Sr Software Engineer - Big Data Team
Sr Software Engineer - Big Data Team About UberWe’re changing the way people think about transport ...
- dll动态链接库导出函数方法 -- 静态导出(__declspec前缀导出)
简介 在之前已经笔者已经写过利用.def文件进行dll函数动态导出的文章,那么今天就给大家介绍一下,如何利用**__declspec**函数前缀进行简单的静态函数导出. 要点 大家阅读过动态导出的文章 ...
- Hadoop HBase概念学习系列之HLog(二)
首先,明确,HRegion服务器包含两大部分:HLog和HRegion. HLog用来存储数据日志,采用的是先写日志的方式. 当用户需要更新数据的时候,数据会被分配到对应的HRegion服务器上提交修 ...
- phpstudy绑定项目(dist文件)域名--陈远波
该篇博客是针对已经打包好的dist文件用phpstudy工具进行域名绑定,dist文件生成在这笔者不进行描述,绑定步骤如下: 一:官网下载phpstudy软件进行安装:http://phpstudy. ...
- 【PyCharm疑问】在pycharm中带有中文时,有时会导致程序判断错误,是何原因?
1.会导致程序打印false错误的代码如下: # -*- coding:utf-8 -*- import os import sys from uiautomator import device as ...
- yaml格式
yaml中允许表示三种格式,分别为常量值.对象和数组 例如: 其中#作为注释,yaml中只有行注释 基本格式要求: 1.大小写敏感:2.使用缩进代表层级关系: 3.缩进只能使用空格,不能使用tab键, ...
- 11.SolrCloud集群环境搭建
转载请出自出处:http://www.cnblogs.com/hd3013779515/ 我们基于Solr4.10.3版本进行安装配置SolrCloud集群,通过实践来实现索引数据的分布存储和检索. ...
- 旋转的地球css3
css3果然博大精深: 1.代码里面还有用box-shadow制作椭圆形阴影的效果,厉害了!之前找了好久都没找到,今天给找到了 html: <section class="stage& ...
- python string.md
string 包含用于处理文本的常量和类.string模块始于Python的最早版本. 2.0版本中, 许多之前只在模块中实现的函数被转移为string对象的方法. 之后的版本中, 虽然这些函数仍然可 ...