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】部署图Deployment diagram(实现图)(转)
http://blog.csdn.net/sds15732622190/article/details/49049665 前言 下面要介绍UML中的部署图,和构件图一样,它也属于实现图的一种,五种静态 ...
- UVALive 4670 Dominating Patterns (AC自动机)
AC自动机的裸题.学了kmp和Trie以后不难看懂. 有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last.没有试过把失配边直接当成普通边(一开始还是先这样写吧). #inc ...
- UVA 1471 Defense Lines 防线 (LIS变形)
给一个长度为n的序列,要求删除一个连续子序列,使剩下的序列有一个长度最大的连续递增子序列. 最简单的想法是枚举起点j和终点i,然后数一数,分别向前或向后能延伸的最长长度,记为g(i)和f(i).可以先 ...
- pycharm 使用技巧
格式化代码为pep8: ctrl+alt+l http://edu.51cto.com//index.php?do=lession&id=163794
- python之*的魔性用法
1. *在函数中的作用 聚合 在函数定义时聚合 def eat(args): print('我请你吃:',args) eat('蒸羊羔儿') # 输出结果 # 我请你吃: 蒸羊羔儿 打散 在函数执行时 ...
- JS实用技术
JS外部引用其他文件(建议) <script src="myScript1.js"></script> JS输出显示方式 使用 window.alert() ...
- 在无TNS配置时,登录到数据库。
sqlplus user/pw@ip:port/servicename sqlplus user/pwd@tnsname sqlplus user/pwd---aix sqlplus /nolog&g ...
- NOIP模拟赛 抓牛
[题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤100000)处,奶牛在K(O≤K≤100000)处.约翰有两种办法 ...
- nginx url rewrite break和last的区别
break 将重写的URI作为一个新的URI,在本块中继续处理,将重写后 的地址在当前location块中处理,不会将新的URI转向到其他location块中 last,终止继续在本location块 ...
- python模块之datetime
相比于time模块,datetime模块的接口则更直观.更容易调用 datetime模块定义了下面这几个类: datetime.date:表示日期的类.常用的属性有year, month, day: ...