问题描述

BZOJ2733

LG3224


题解

对于每个结点建立一棵权值线段树。

查询操作就去查询第 \(k\) 大,合并操作就合并两颗权值线段树。

并查集维护连通性。

同时 STO hkk,zcr,zzk


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
} template <typename Tp>
void fr(Tp &x){
char ch=1;
while(ch!='Q'&&ch!='B') ch=getchar();
if(ch=='Q') x=1;
else x=2;
} const int maxn=100003; int n,m,T;
int rk[maxn];
int pre[maxn]; int rt[maxn],L[maxn*22],R[maxn*22],cnt;
int val[maxn*22],fa[maxn]; void pushup(int x){
val[x]=val[L[x]]+val[R[x]];
} int insert(int x,int l,int r,int p,int v){
if(!x) x=++cnt;
if(l==r){
val[x]+=v;
return x;
}
int mid=(l+r)>>1;
if(p<=mid) L[x]=insert(L[x],l,mid,p,v);
else R[x]=insert(R[x],mid+1,r,p,v);
pushup(x);
return x;
} int merge(int p,int q,int l,int r){
if(!p||!q) return p+q;
if(l==r){
val[q]+=val[p];return q;
}
int mid=(l+r)>>1;
L[q]=merge(L[p],L[q],l,mid);
R[q]=merge(R[p],R[q],mid+1,r);
pushup(q);
return q;
} int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
} int query(int x,int l,int r,int k){
if(!x&&k) return -1;
if(r-l+1<k) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(!L[x]&&!R[x]&&k) return -1;
if(L[x]&&val[L[x]]>=k) return query(L[x],l,mid,k);
else return query(R[x],mid+1,r,k-val[L[x]]);
} void cz1(){
int x,k;read(x);read(k);
int xx=find(x);
int ppp=query(rt[xx],1,100000,k);
printf("%d\n",pre[ppp]);
} void cz2(){
int x,y;read(x);read(y);
int xx=find(x),yy=find(y);
if(xx==yy) return;
fa[xx]=yy;
merge(rt[xx],rt[yy],1,100000);
} int main(){
read(n);read(m);
for(int i=1;i<=n;i++) read(rk[i]),pre[rk[i]]=i;
for(int i=1;i<=n;i++) rt[i]=++cnt;
for(int i=1;i<=n;i++){
fa[i]=i;
insert(rt[i],1,100000,rk[i],1);
} // #define debug1 #ifdef debug1
for(int i=1;i<=n;i++)
printf("%d %d\n",query(rt[i],1,100000,1),query(rt[i],1,100000,2));
#endif for(int i=1,x,y;i<=m;i++){
read(x);read(y);
int xx=find(x),yy=find(y);
if(xx==yy) continue;
fa[xx]=yy;
merge(rt[xx],rt[yy],1,100000);
}
int T,op;read(T);
while(T--){
fr(op);
if(op==1) cz1();
else cz2();
}
return 0;
}

BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并的更多相关文章

  1. BZOJ 2733 [HNOI2012]永无乡 (权值线段树启发式合并+并查集)

    题意: n<=1e5的图里,在线连边.查询某连通块第k大 思路: 练习线段树合并的好题,因为依然记得上一次启发式合并trie的时候内存爆炸的恐怖,所以这次还是用了动态开点.回收 听说启发式合并s ...

  2. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  3. luogu3224 永无乡(动态开点,权值线段树合并)

    luogu3224 永无乡(动态开点,权值线段树合并) 永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示.某些 ...

  4. LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)

    题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...

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

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

  6. 「HNOI2012」永无乡

    传送门 Luogu 解题思路 很容易想到平衡树,然后还可以顺便维护一下连通性,但是如何合并两棵平衡树? 我们采用一种类似于启发式合并的思想,将根节点siz较小的那颗平衡树暴力的合并到另一颗上去. 那么 ...

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

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

  8. 【BZOJ2733】【HNOI2012】永无乡 - 线段树合并

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

  9. 【BZOJ2733】永无乡[HNOI2012](splay启发式合并or线段树合并)

    题目大意:给你一些点,修改是在在两个点之间连一条无向边,查询时求某个点能走到的点中重要度第k大的点.题目中给定的是每个节点的排名,所以实际上是求第k小:题目求的是编号,不是重要度的排名.我一开始差点被 ...

随机推荐

  1. Java流程控制之顺序结构

    概述 在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的.也就是说,程序的流程对运行结果有直接的影响.所以,我们必须清楚每条语句的执行流程.而且,很多时候我们要通过控制语句的执行顺序 ...

  2. echarts常用说明

    import { Injectable } from '@angular/core'; //模板option通用 let fff7 = '#fff'; //字体统一颜色rgba(255,255,255 ...

  3. 实验:用Unity抓取指定url网页中的所有图片并下载保存

    突发奇想,觉得有时保存网页上的资源非常麻烦,有没有办法输入一个网址就批量抓取对应资源的办法呢. 需要思考的问题: 1.如何得到网页url的html源码呢? 2.如何在浩瀚如海的html中匹配出需要的资 ...

  4. Nginx之前后端分离(入门)

    几个月前,公司架构优化,首先就是前后端分离. 所谓前后端分离,就是在传统的前后端代码都在一个项目里的基础上,将前后端代码抽离,把前端代码从后端项目了分离出来,前后端开发人员各自在自己的项目里开发. 为 ...

  5. PriorityBlockingQueue

    public class PriorityBlockingQueueTest { /** * 有优先级顺序的阻塞队列,底层实现是数组,无边界.默认是11. * 构造方法可以传入一个比较器,不传的话,默 ...

  6. 五分钟搞定 HTTPS 配置,二哥手把手教

    01.关于 FreeSSL.cn FreeSSL.cn 是一个免费提供 HTTPS 证书申请.HTTPS 证书管理和 HTTPS 证书到期提醒服务的网站,旨在推进 HTTPS 证书的普及与应用,简化证 ...

  7. 用Scriban进行模版解析

    前言 有些时候,我们需要根据模版去展示一些内容,通常会借助模版引擎来处理. 举个简单的例子,发短信. 短信肯定是有模版的,不同的场景对应不同的模版. 注册的, [xxx]恭喜您成功注册yyy平台,您的 ...

  8. laravel中视图的基本使用(七)

    laravel中的视图默认保存在 resources\views 目录下.在控制器中,我们通常使用 view() 方法返回一个视图文件. <?php namespace App\Http\Con ...

  9. ros相机标定

    没有经过校准的camera拍摄的图片是有畸变的.如下图: 而我们希望得到的图片是这样的 ros中提供了一个程序camera_calibration帮助我们去做校准. 具体怎么校准参考 https:// ...

  10. 使用Node.js简单创建一个服务器

    首先,我们要了解Node.js不是一种语言,它只是一个除了浏览器之外的,可以运行js的环境. 其次,Node能做些什么 ? web服务器.  命令行工具.   网络爬虫. 桌面应用程序开发等 3.接下 ...