正解:线段树合并

解题报告:

传送门!

这题也是有很多解法,eg:splay,treap,...

然而我都不会我会学的QAQ!

反正今天就只讲下线段树合并怎么做QAQ

首先看到这样子的说第k重要的是什么,然后又不是问某个区间内,那就肯定是权值线段树做嘛

然后考虑到连桥,那显然就是并茶几维护连通性,然后如果不在一个块的连起来了就线段树合并一下就好了嘛

然后就麻油辣!overr!

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define rp(i,x,y) for(rg int i=x;i<=y;++i) const int N=+;
int n,m,q,st[N],tot,nod_cnt,rt[N],r,l,fa[N],num[N];
struct sgtr{int l,r,ls,rs,sz,name;}tr[N<<]; il int fd(int x){return fa[x]==x?x:fa[x]=fd(fa[x]);}
il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il char rdch(){rg char ch=gc;while(ch!='Q' && ch!='B')ch=gc;return ch;}
il int modify(int l,int r,int dat)
{
int nw=++nod_cnt;tr[nw].l=l;tr[nw].r=r;tr[nw].sz++;if(l==r)return nw;int mid=(l+r)>>;
if(dat<=mid)tr[nw].ls=modify(l,mid,dat);
else tr[nw].rs=modify(mid+,r,dat);
return nw;
}
il int merge(int nw1,int nw2)
{
if(!nw1 || !nw2)return nw1+nw2;
if(tr[nw1].l==tr[nw1].r)return tr[nw1].sz+=tr[nw2].sz,nw1;
tr[nw1].sz+=tr[nw2].sz;tr[nw1].ls=merge(tr[nw1].ls,tr[nw2].ls);tr[nw1].rs=merge(tr[nw1].rs,tr[nw2].rs);
return nw1;
}
il int query(int nw,int dat)
{
if(tr[nw].sz<dat)return -;
if(tr[nw].l==tr[nw].r)return num[tr[nw].l];
if(tr[tr[nw].ls].sz>=dat)return query(tr[nw].ls,dat);
return query(tr[nw].rs,dat-tr[tr[nw].ls].sz);
} int main()
{
// freopen("ywx.in","r",stdin);freopen("ywx.out","w",stdout);
n=read();m=read();rp(i,,n){fa[i]=i;int x;num[x=read()]=i,rt[i]=modify(,n,x);}
rp(i,,m){int x=read(),y=read();x=fd(x);y=fd(y);if(x!=y)rt[x]=merge(rt[x],rt[y]),fa[y]=x;}
q=read();
rp(i,,q){char op=rdch();int x=read(),y=read();if(op=='B'){x=fd(x);y=fd(y);if(x!=y)merge(rt[x],rt[y]),fa[y]=x;}else{printf("%d\n",query(rt[fd(x)],y));}}
return ;
}

然后这儿是代码QwQ!

洛谷P3224 永无乡 [HNOI2012] 线段树/splay/treap的更多相关文章

  1. 洛谷 [P3224] 永无乡

    Treap 的合并 首先感谢 @Capella 的DeBug 其次,这是由一个 & 号引发的血案 注意对于所有修改操作都要 & Treap的合并, 启发式合并,对于每一个节点都 ins ...

  2. 【BZOJ2733】永无乡(线段树,并查集)

    [BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...

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

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

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

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

  5. 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)

    传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...

  6. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

  7. luoguP3224 [HNOI2012]永无乡【线段树,并查集】

    洞庭青草,近中秋,更无一点风色.玉鉴琼田三万顷,着我扁舟一叶.素月分辉,明河共影,表里俱澄澈.悠然心会,妙处难与君说. 应念岭表经年,孤光自照,肝胆皆冰雪.短发萧骚襟袖冷,稳泛沧溟空阔.尽挹西江,细斟 ...

  8. 【BZOJ2733】永无乡(线段树,启发式合并)

    题意:支持合并,求块内K小数 对于 100%的数据 n≤100000,m≤n,q≤300000 思路:对于每一个块建立一棵动态开点的线段树,暴力(启发式?)合并后二分下就行了 merge用函数的方式写 ...

  9. 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]

    [题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...

随机推荐

  1. buildroot 编译问题

    buildroot 编译的时候,出现 g++: internal compiler error: Killed (program cc1plus) 这个是因为虚拟机内存不足的原因, 加上一些内存即可 ...

  2. Android5.0通知变化浅析

    目前在Android中通知的使用还是很常见的,为了做版本兼容,常用兼容包NotificationCompat.Builder和 Notification.Builder. NotificationCo ...

  3. 新手谈Linux

    目录: 什么是Linux? Linux与UNIX的区别 Linux与Windows比较 什么是Linux发布版? Linux应用领域 Linux版本的选择 怎么学习Linux? Linux系统配置 通 ...

  4. LVS DR模式搭建 keepalived lvs

    LVS DR模式搭建• 三台机器 • 分发器,也叫调度器(简写为dir)172.16.161.130 • rs1 172.16.161.131 • rs2 172.16.161.132 • vip 1 ...

  5. Linux/Centos下使用mtr做路由图进行网络分析

    工具作用: mtr可以做路由图供我们分析哪里出现故障或者是否存在有网络拥塞的情况 1. 首先安装mtr 工具 使用yum  安装 :  yum  install mtr -y  2. 使用 我经常在工 ...

  6. django 同步数据库出现 No changes detected 的可能原因

    在使用 python manage.py makemigrations时候会出现:No changes detected 的错误. 造成这个错误的原因可能有很多. 我这里遇到这个错误的原因是:migr ...

  7. python模块和类的通用转换规则(2),三步转oo

    介绍模块和类怎么互相转换,不谈面向对象的继承 封装 多态等特点. 一个person_module模块,有人的基本属性和功能. person_module.py如下 # coding=utf8 name ...

  8. 网络编程 -- RPC实现原理 -- NIO单线程

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 Class : Service package lime.pri.limeNio.optimize.socket; import java.io.B ...

  9. ios开发之--valueForKeyPath的用法

    1.获取数组中的平均值,最大值,最小值,总和,代码如下: NSArray *ary = @[@,@,@,@,@,@,@]; [self caculateArray:ary]; -(NSString * ...

  10. Git-简单的利用SourceTree提交代码

    解决办法: 小编也是新手,所以在使用SourceTree上面花了不少时间,好在简单的拉去远程代码,同步本地仓库代码搞定了.下面是步骤: 1.我们先去下载一个SourceTree然后打开. 2.下一步, ...