BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集
用并查集维护联通块。
用线段树的合并来合并联通块。
自己YY了一个写法。
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 150005 int ls[maxn<<5],rs[maxn<<5],rt[maxn];
int fa[maxn],n,m,tot,sum[maxn<<5],q; char opt[11]; void modify(int o1,int &o2,int l,int r,int x,int f)
{
o2=++tot;sum[o2]=sum[o1]+f;if(l==r)return;int mid=l+r>>1;
if (x<=mid) rs[o2]=rs[o1],modify(ls[o1],ls[o2],l,mid,x,f);
else ls[o2]=ls[o1],modify(rs[o1],rs[o2],mid+1,r,x,f);
} int gf(int k)
{
if (fa[k]==k) return k;
else return fa[k]=gf(fa[k]);
} int merge(int o1,int o2,int l,int r)
{
if (!(o1*o2)) return o1+o2;
int mid=l+r>>1;sum[o1]+=sum[o2];
ls[o1]=merge(ls[o1],ls[o2],l,mid);
rs[o1]=merge(rs[o1],rs[o2],mid+1,r);
return o1;
} int query(int o,int l,int r,int x)
{
if (sum[o]<x) return -1;
if (l==r) return l;
int mid=l+r>>1;
if (x<=sum[ls[o]]) return query(ls[o],l,mid,x);
else return query(rs[o],mid+1,r,x-sum[ls[o]]);
} void Debug(int o,int l,int r)
{
if (!o) return ;
printf(" %d %d == %d\n",l,r,sum[o]);
if (l==r) return ;
Debug(ls[o],l,l+r>>1);
Debug(rs[o],(l+r>>1)+1,r);
} int list[maxn]; int main()
{
scanf("%d%d",&n,&m);
F(i,1,n) fa[i]=i,rt[i]=0;
F(i,1,n)
{
int x;
scanf("%d",&x);
modify(rt[i],rt[i],1,n,x,1);
list[x]=i;
}
F(i,1,m)
{
int x,y,fx,fy; scanf("%d%d",&x,&y);
fx=gf(x);fy=gf(y);
if (fx==fy) continue;
else
fa[fy]=fx,rt[fx]=merge(rt[fx],rt[fy],1,n);
}
scanf("%d",&q);
F(i,1,q)
{
int x,y,fx,fy,tmp;
scanf("%s%d%d",opt,&x,&y);
switch(opt[0])
{
case 'Q':
fx=gf(x);
tmp=query(rt[fx],1,n,y);
printf("%d\n",tmp==-1?-1:list[query(rt[fx],1,n,y)]);
break;
case 'B':
fx=gf(x);fy=gf(y);
if (fx!=fy)
{
fa[fy]=fx;
rt[fx]=merge(rt[fx],rt[fy],1,n);
}
break;
}
}
}
BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集的更多相关文章
- bzoj 2733: [HNOI2012]永无乡 -- 线段树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...
- Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...
- bzoj 2733 : [HNOI2012]永无乡 (线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 2733: [HNOI2012]永无乡 线段树合并
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=2733 题解: 建n棵动态开点的权值线段树,然后边用并查集维护连通性,边合并线段树维护第k重 ...
- bzoj 2733: [HNOI2012]永无乡 离线+主席树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1167 Solved: 607[Submit][Status ...
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...
- Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3955 Solved: 2112[Submit][Statu ...
随机推荐
- 【UML】状态图Statechart diagram(转)
前言 UML由动态图和静态图组成,状态图就是属于动态图中较为重要的一张图. 定义 用来描述一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态之间的转移. 目的 ...
- appium---启动app
自动化测试是测试人员必备的一项技能,所谓的自动化就是通过代码完成了手工的操作,今天就总结下如何通过python启动app 环境条件 1.安装python:下载地址 2.安装JDK:下载地址 3.安装A ...
- JavaScript——图片懒加载
前言 有一个朋友问我这个问题,刚好有时间,现在就简单的写个Demo~ github | https://github.com/wangyang0210/bky/tree/picLoadLazy 内容 ...
- 在Vue将第三方JS库封装为组件使用
第三方JS库地址:https://github.com/inorganik/CountUp.js 使用NPM进行安装: npm install --save countup 根据官方回答,CountU ...
- logging console not work
配置 log 信息传输到控制台 参考官网:https://docs.djangoproject.com/en/2.1/topics/logging/ By default, this config o ...
- 【转】嵌入式操作系统VxWorks中TFFS文件系统的构建
时间:2005-02-20 来源:21IC中国电子网 作者:771所加固机工程部 蔡本华 高文炜 关键字:VxWorks TFFS 嵌入式操作系统 文件系统 摘要:目前的嵌入式 ...
- Ubuntu下kaldi安装
该文章为博主原创,如若转载请注明出处:https://www.cnblogs.com/fengleixue/p/9482202.html 因公司业务需要需使用kaldi语音识别工具,现将kaldi环境 ...
- 使用slot-scope复制vue中slot内容
有时候我们的vue组件需要复制使用者传递的内容. 比如我们工程里面的轮播组件需要使用复制的slot来达到循环滚动的效果 使用者关注轮播内容的静态效果,组件负责让其滚动起来 组件: <div cl ...
- python爬虫基础14-selenium大全8/8-常见问题
Selenium笔记(8)常见的坑 本文集链接:https://www.jianshu.com/nb/25338984 用Xpath查找数据时无法直接获取节点属性 通常在我们使用xpath时,可以使用 ...
- unix cc编译过程
1.编译并链接一个完全包含与一个源文件的C程序: cc program.c 这条命令产生一个称为a.out的可执行程序.中间会产生一个名为program.o的目标 ...