http://www.lydsy.com/JudgeOnline/problem.php?id=2733 (题目链接)

题意

  给出图上$n$个点,每个点有一个点权,每次询问一个连通块中点权第$K$小的点是谁,或者连接两个点。

Solution

  权值线段树合并。

细节

  也许会有负数?

代码

// bzoj2733
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define lim 1000000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int n,m,Q,sz,rt[maxn],fa[maxn],size[maxn];
struct node {
int son[2],s,id;
int& operator [] (int x) {return son[x];}
}tr[maxn*40]; namespace Segtree {
void build(int &k,int l,int r,int val,int id) {
if (!k) k=++sz;
if (l==r) {tr[k].s=1;tr[k].id=id;return;}
int mid=(l+r)>>1;
if (val<=mid) build(tr[k][0],l,mid,val,id);
else build(tr[k][1],mid+1,r,val,id);
tr[k].s=tr[tr[k][0]].s+tr[tr[k][1]].s;
}
int merge(int u,int v) {
if (!u || !v) return u|v;
tr[u][0]=merge(tr[u][0],tr[v][0]);
tr[u][1]=merge(tr[u][1],tr[v][1]);
tr[u].s=tr[tr[u][0]].s+tr[tr[u][1]].s;
return u;
}
int query(int u,int l,int r,int k) {
if (l==r) return tr[u].id;
int mid=(l+r)>>1,c=tr[tr[u][0]].s;
if (c>=k) return query(tr[u][0],l,mid,k);
else return query(tr[u][1],mid+1,r,k-c);
}
}
using namespace Segtree; int find(int x) {
return x==fa[x] ? x : fa[x]=find(fa[x]);
}
int main() {
scanf("%d%d",&n,&m);
for (int x,i=1;i<=n;i++) {
scanf("%d",&x);fa[i]=i;size[i]=1;
build(rt[i],-lim,lim,x,i);
}
for (int u,v,i=1;i<=m;i++) {
scanf("%d%d",&u,&v);
u=find(u),v=find(v);
if (size[u]<size[v]) swap(u,v);
fa[v]=u;size[u]+=size[v];
rt[u]=merge(rt[u],rt[v]);
}
scanf("%d",&Q);char ch[10];
for (int x,y,i=1;i<=Q;i++) {
scanf("%s%d%d",ch,&x,&y);
if (ch[0]=='Q') {
x=find(x);
printf("%d\n",size[x]<y ? -1 : query(rt[x],-lim,lim,y));
}
if (ch[0]=='B') {
x=find(x),y=find(y);
if (x!=y) {
if (size[x]<size[y]) swap(x,y);
fa[y]=x;size[x]+=size[y];
rt[x]=merge(rt[x],rt[y]);
}
}
}
return 0;
}

【bzoj2733】 HNOI2012—永无乡的更多相关文章

  1. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  2. bzoj2733: [HNOI2012]永无乡(splay)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永 ...

  3. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4108  Solved: 2195[Submit][Statu ...

  4. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  5. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  7. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  8. bzoj2733: [HNOI2012]永无乡 线段树合并

    永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...

  9. BZOJ2733: [HNOI2012]永无乡(线段树合并)

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  10. BZOJ2733 [HNOI2012]永无乡

    直接平衡树启发式合并就好了...貌似是个很高端的东西.. 貌似可以证明splay的启发式合并是均摊$O(nlogn)$的...而其他平衡树都不行,所以其他的复杂度都是$O(nlog^2n)的$的 所以 ...

随机推荐

  1. 有关JOIN ON的心得体会

    在第一家公司工作大概有一年之后,我的上司开始让我负责一个项目了. 说起这个项目,其实就是类似一个报表系统的抽数据的活.我的主要工作就是将我们公司产生的数据进行抽取清理,然后生成一些带有分析性质的数据. ...

  2. 2019第十届蓝桥杯 E题 迷宫

    /*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...

  3. 初学node.js-npm使用(2)

    1.安装Node封装模块 安装Node封装模块很重要,因为开发项目中会用到各种各样的功能,这时就需要去下载开源的模块 使用npm install <module_name> module_ ...

  4. PASSWORD MySQL 5.6.21-1ubuntu14.04_amd64

    /***************************************************************************** The main idea is that ...

  5. 使用Python 统计nginx日志前十ip访问量并以柱状图显示

    脚本内容: import matplotlib.pyplot as plt # nginx_file = '10.6.11.91_access.log-2018-12-27' ip = {} #筛选n ...

  6. Java-URLEncoder.encode 什么时候才是必须的

    当你希望把一段 URL 当成另一个 URL 的参数时,比如:当用户点击交易的按钮时你发现未登录就跳转到 login 页面同时带上一个参数记录在登录之前用户是希望访问的那个交易页面,这样在登录完成之后再 ...

  7. Linux下查看cpu使用率

    top命令 是Linux下常用的性能 分析工具 ,能够实时显示系统 中各个进程的资源占用状况,类似于Windows的任务管理 器.下面详细介绍它的使用方法. top - 02:53:32 up 16 ...

  8. Head First Java & 重载 覆盖

  9. 项目总结之关于JQuery一些常用的函数

    最近做一个小的项目,用到了很多关于jquery函数,下面简单总结下自我感觉比较常用的一些函数. jquery函数--Hide函数用法 jquery中,hide函数用于实现层的消失,相反,show函数用 ...

  10. grunt入门讲解7:项目脚手架grunt-init

    grunt-init是一个用于自动创建项目脚手架的工具.它会基于当前工作环境和你给出的一些配置选项构建一个完整的目录结构.至于其所生成的具体文件和内容,依赖于你所选择的模版和构建过程中你对具体信息所给 ...