洛谷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\) ,每座岛都有自己的独一无二的重要度,按照重要 ...
随机推荐
- cbow与skip-gram
场景:上次回答word2vec相关的问题,回答的是先验概率和后验概率,没有回答到关键点. 词袋模型(Bag of Words, BOW)与词向量(Word Embedding)模型 词袋模型就是将句子 ...
- oracle 11g 使用物化视图远程增量刷新数据
① 源数据库建立物化视图日志 drop MATERIALIZED VIEW LOG ON ORG_BASEINFO/ CREATE MATERIALIZED VIEW LOG ON ORG_BASEI ...
- ZMQ通信模式
本文简要介绍ZMQ常用的通信模式 请求响应模式 常规搭配:ZMQ_REQ + ZMQ_REP 带输入负载(Round Robin)均衡搭配:ZMQ_REQ + ZMQ_ROUTER 消息分发搭配:ZM ...
- 【GIS】Vue、Leaflet、highlightmarker、bouncemarker
感谢: https://github.com/brandonxiang/leaflet.marker.highlight https://github.com/maximeh/leaflet.boun ...
- php MongoDB driver 查询实例
//是否只查mx $mx_on_switch = I("post.mx_on_switch"); //mx模糊查询 $mx_vague_check = I("post.m ...
- 欢迎访问新博客(pfzheng.tech)
这两天折腾了几天的服务器,搞了一个临时的个人博客. 最先入手的域名pfzheng.tech,但是发现竟然不支持备案.天哪,我做错了什么,只好再买域名.新域名pfzheng.cn正在备案中. 新博客基于 ...
- Intersection Observer API 可以让你知道被观察元素何时进入或退出浏览器的视口
google 文档 https://developers.google.cn/web/updates/2016/04/intersectionobserver MDN 文档 https://devel ...
- c++中map按key和value排序
``` #include<iostream> #include<algorithm> #include<vector> #include<map> #i ...
- CentOS和Redhat救援模式
当单用户模式无法修复系统时可以使用救援模式 把系统盘插入光驱重启主机 选择救援模式 默认选择 是否设置网络这里选择否 已读写模式挂载 提示系统挂载/mnt/sysimage如果需要恢复运行 chroo ...
- opencv中 int main(int argc,char* argv[])详解
opencv中 int main(int argc,char* argv[])详解 argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 ...