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 ...
随机推荐
- UVA12897 - Decoding Baby Boos
没必要每次都真的修改一遍字母值,用一个标记表示字母最后的值,最后一遍的时候再进行修改 #include<cstdio> #include<cstring> +; char st ...
- UITableView设计思想 考察
整体使用了build模式:单是组织结构混乱:不符合人类思维. UITableViewDataSource:描述了View的要素个数情况:并担负了builder功能. UITableViewDelega ...
- C# 替换去除HTML标记方法(正则表达式)
[from] http://blog.csdn.net/sgear/article/details/6263848/// <summary> /// 将所有HTML标签替换成"& ...
- 01_12_Struts2_访问Web元素
01_12_Struts2_访问Web元素 1. 配置struts.xml文件 <package name="login" namespace="/login&qu ...
- 01_6_SERVLET如何从上一个页面取得参数
01_6_SERVLET如何从上一个页面取得参数 1. sevlet实现 public void doGet(HttpServletRequest request, HttpServletRespon ...
- 判断是否是同一人的方法——equals()?在Person类中提供一个比较的方法compare()返回boolean值?对象自己和自己比?
判断是否是同一人的方法——equals() 不能直接用per1==per2,这不是对象内容的比较而是存放对象地址的值得比较 在Person类中提供一个比较的方法compare()返回boolean值 ...
- d3.js--02(data和datum原理)
原文链接: http://d3.decembercafe.org/pages/lessons/3.html 解析一下data和datum原理: datum():绑定一个数据到选择集上 data():绑 ...
- error PRJ0019: 工具从 “正在执行生成后事件... ”
error PRJ0019: 工具从"正在执行生成后事件..." 原因是属性->生成事件->生成后事件 命令行设置错误导致的,修改即可 因为path前面有空格,所以这里 ...
- Python基础学习总结__Day3
一.集合 1.特性:无序且天生去重,格式为{} 2.作用: (1)去重 (2)关系测试 3.可调用函数(常见对列表操作) (1)取交集:A.intersection(B) (2)取并集:A.union ...
- python输出mssql 查询结果示例
# -*- coding: utf-8 -*-# python 3.6import pymssql conn=pymssql.connect(host='*****',user='******',pa ...