问题描述

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. 题解:swj社会摇入魔第五课

    题目链接; solution: 根据画图模拟可以知道除第一次纯下降 其余每次都是一半一半的增加 S=h+h+h/2+h/4+h/8+...; 即S=h+2h=3h #include<bits/s ...

  2. python画一片绿叶给你

    怎么用 turtle 画一个 π 字,于是我顺手到网上大致搜了下,发现网上没有画这个 π 字的,接着又用谷歌加英文搜索了下,还是没找到现成的答案. 不过通过这次搜索意外发现了一个有趣的网站,网站上有大 ...

  3. 【OCR系列之一】字符识别技术总览

    最近入坑研究OCR,看了比较多关于OCR的资料,对OCR的前世今生也有了一个比较清晰的了解.所以想写一篇关于OCR技术的综述,对OCR相关的知识点都好好总结一遍,以加深个人理解. 什么是OCR? OC ...

  4. Long Jumps CodeForces - 479D

    E - Long Jumps CodeForces - 479D Valery is a PE teacher at a school in Berland. Soon the students ar ...

  5. P站全新官方精选集Pixivision

    P站是一个主要由日本艺术家所组成的虚拟社群,主打插画.漫画.二次元作品网上沟通. 不过好消息是,P站全新的精选网站Pixivision上线了,多种语言界面,国内用户访问毫无压力. 近期精选的一系列作品 ...

  6. 【转】理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文

    这篇英文博文是 Andrew Lock 写的 Introduction to Authentication with ASP.NET Core . 以下是简单的阅读笔记: -------------- ...

  7. flex布局和边框阴影

    "妄"眼欲穿-CSS之flex布局和边框阴影 妄:狂妄: 不会的东西只有怀着一颗狂妄的心,假装能把它看穿吧. flex布局 main axis:主轴:cross axis:交叉轴 ...

  8. solidity定长数组和动态数组

    固定长度的数组 固定长度数组声明 直接在定义数组的时候声明固定长度数组的值: uint[5] fixedArr = [1,2,3,4,5]; 可通过数组的length属性来获得数组的长度,进而进行遍历 ...

  9. 机器学习常见的几种评价指标:精确率(Precision)、召回率(Recall)、F值(F-measure)、ROC曲线、AUC、准确率(Accuracy)

    原文链接:https://blog.csdn.net/weixin_42518879/article/details/83959319 主要内容:机器学习中常见的几种评价指标,它们各自的含义和计算(注 ...

  10. PlayJava Day001

    今日所学: /* 2019.08.19开始学习,此为补档. */ 三目(元)运算符 格式:(表达式)? 表达式为true返回值A : 表达式为false返回值B 例: String s=2>3 ...