洛谷P3224 永无乡 [HNOI2012] 线段树/splay/treap
正解:线段树合并
解题报告:
这题也是有很多解法,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的更多相关文章
- 洛谷 [P3224] 永无乡
Treap 的合并 首先感谢 @Capella 的DeBug 其次,这是由一个 & 号引发的血案 注意对于所有修改操作都要 & Treap的合并, 启发式合并,对于每一个节点都 ins ...
- 【BZOJ2733】永无乡(线段树,并查集)
[BZOJ2733]永无乡(线段树,并查集) 题面 BZOJ 题解 线段树合并 线段树合并是一个很有趣的姿势 前置技能:动态开点线段树 具体实现:每次合并两棵线段树的时候,假设叫做\(t1,t2\), ...
- BZOJ2733 [HNOI2012]永无乡 【线段树合并】
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ2733: [HNOI2012]永无乡(线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)
传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- luoguP3224 [HNOI2012]永无乡【线段树,并查集】
洞庭青草,近中秋,更无一点风色.玉鉴琼田三万顷,着我扁舟一叶.素月分辉,明河共影,表里俱澄澈.悠然心会,妙处难与君说. 应念岭表经年,孤光自照,肝胆皆冰雪.短发萧骚襟袖冷,稳泛沧溟空阔.尽挹西江,细斟 ...
- 【BZOJ2733】永无乡(线段树,启发式合并)
题意:支持合并,求块内K小数 对于 100%的数据 n≤100000,m≤n,q≤300000 思路:对于每一个块建立一棵动态开点的线段树,暴力(启发式?)合并后二分下就行了 merge用函数的方式写 ...
- 【题解】永无乡 [HNOI2012] [BZOJ2733] [P3224]
[题解]永无乡 [HNOI2012] [BZOJ2733] [P3224] [题目描述] 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要 ...
随机推荐
- nginx日志分割小脚本
nginx的日志一直是写在一个文件上面,运行久了之后文件会非常大,因此我们有必要对nginx的日志进行分割: 1 2 3 4 5 6 7 8 9 10 11 #! /bin/bash ACCESS ...
- 假期小结 BIO, NIO, AIO
虽然忙碌,但仍小有收获,开心. 引子 BIO: Blocking IO,阻塞式IO NIO: Non-blocking IO,非阻塞式IO AIO: Async IO,异步IO 问题 什么是阻塞式IO ...
- 解决Android SDK Manager无法更新下载
Android Studio2.2版本有一个bug,当在gradle文件编写代码时,程序会自动同步编译,这时整个程序都处于页面卡顿状态,要等待很久才能缓过来.最近实在忍受不了这种龟速,刚好发现有了新的 ...
- ios时间差
/** * @method * * @brief 获取两个日期之间的天数 * @param fromDate 起始日期 * @param toDate 终止日期 * @re ...
- centos7 安装redis服务及phpredis扩展
闲话少说 服务器版本:centos7.6 64位 软件包:https://pan.baidu.com/s/1Gb4iz5mqLqNVWvvZdBiOMQ 提取码: xrhx 一.安装redis 放在/ ...
- win怎么设置最快捷的下滑关机
win怎么设置最快捷的下滑关机 1.在C:\Windows\System32下找到SlideToShutDown.exe文件发送一份到桌面快捷方式 2.右键此快捷方式--属性--更换图表--更换一个自 ...
- Flask web开发之路七
今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...
- xcode reset 删除重新安装
Type "rm -rf ~/Library/Application Support/Xcode" and press "Enter." This remove ...
- .Net Windows Service(服务) 调试安装及System.Timers.Timer 使用
Windows Service(服务) 是运行在后台的进程 1.VS建立 Windows 服务(.NET Framework) 2.添加Timer 双击Service1.cs可以拖控件(System ...
- [No0000D6]端口-进程查询.bat
@echo off color a Title XP端口-进程查询 setlocal enabledelayedexpansion echo ╔- -╗ echo 本机开放的端口及使用该端口的进程 e ...