问题描述

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. Eclipse maven创建web项目报错Could not resolve archetype

    1.下载http://repo1.maven.org/maven2/archetype-catalog.xml 通过eclipse下载和网页下载我这里都比较慢,最后用的迅雷下载 2.将本地xml文件配 ...

  2. MS SQL OPENJSON JSON

    前段时间,有写过一个小练习<MS SQL读取JSON数据>https://www.cnblogs.com/insus/p/10911739.html 晚上为一个网友的问题,尝试获取较深层节 ...

  3. python做中学(六)os.getcwd() 的用法

    概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd() 参数 无 返回值 返回当前进程的工作目录. 实例 以下实例演示了 getcw ...

  4. 融云技术分享:解密融云IM产品的聊天消息ID生成策略

    本文来自融云技术团队原创分享,原文发布于“融云全球互联网通信云”公众号,原题<如何实现分布式场景下唯一 ID 生成?>,即时通讯网收录时有部分改动. 1.引言 对于IM应用来说,消息ID( ...

  5. Vue ---- 组件文件分析 组件生命周期钩子 路由 跳转 传参

    目录 Vue组件文件微微细剖 Vue组件生命周期钩子 Vue路由 1.touter下的index.js 2.路由重定向 3.路由传参数 补充:全局样式导入 路由跳转 1. router-view标签 ...

  6. 拎壶学python3-----(2)python之if语句用法

    在生活中我们经常遇到各种选择,比如玩色子,猜大小,再比如选择未来另一半.python也经常会遇到这样的选择,这时候if语句显得尤为重要. 下边我们看一个简单的例子 如果是二选一怎么做呢?如下 如果多个 ...

  7. 【学习笔记】动态规划—各种 DP 优化

    [学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成 ...

  8. 数据库——SQL-SERVER练习(5) 供应关系

    以下题目用到工程供应数据库关系模式:供应商(供应商号,供应商名,城市)        S(Sno,Sname,City)零件(零件号,零件名,零件颜色)     P(Pno,Pname,Color)工 ...

  9. JavaFx出现错误Caused by: java.lang.NullPointerException: Location is required的解决方法

    问题截图: "C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:I:\IntelliJ IDEA ...

  10. python web框架Django——ORM

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...