线段树合并好写好调,隔壁老王的treap+启发式合并难写难调

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, fa[100005], val[100005], rot[100005], uu, vv, fan[100005], cnt;
int lson[5000005], rson[5000005], sum[5000005];
char ss[5];
int myfind(int x){
return fa[x]==x?x:fa[x]=myfind(fa[x]);
}
void insert(int &k, int l, int r, int x){
if(!k) k = ++cnt;
if(l==r) sum[k] = 1;
else{
int mid=(l+r)>>1;
if(x<=mid) insert(lson[k], l, mid, x);
if(mid<x) insert(rson[k], mid+1, r, x);
sum[k] = sum[lson[k]] + sum[rson[k]];
}
}
int query(int o, int l, int r, int x){
if(l==r) return l;
int mid=(l+r)>>1;
if(x<=sum[lson[o]]) return query(lson[o], l, mid, x);
else return query(rson[o], mid+1, r, x-sum[lson[o]]);
}
int merge(int x, int y){
if(x==0 || y==0) return x+y;
lson[x] = merge(lson[x], lson[y]);
rson[x] = merge(rson[x], rson[y]);
sum[x] = sum[lson[x]] + sum[rson[x]];
return x;
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
scanf("%d", &val[i]);
fa[i] = i;
fan[val[i]] = i;
}
for(int i=1; i<=m; i++){
scanf("%d %d", &uu, &vv);
fa[myfind(vv)] = myfind(uu);
}
for(int i=1; i<=n; i++)
insert(rot[myfind(i)], 1, n, val[i]);
cin>>m;
while(m--){
scanf("%s", ss);
if(ss[0]=='Q'){
scanf("%d %d", &uu, &vv);
int p=myfind(uu);
if(sum[rot[p]]<vv) printf("-1\n");
else printf("%d\n", fan[query(rot[p], 1, n, vv)]);
}
else{
scanf("%d %d", &uu, &vv);
int p=myfind(uu), q=myfind(vv);
if(p!=q){
fa[q] = p;
rot[p] = merge(rot[q], rot[p]);
}
}
}
return 0;
}

luogu3224 [HNOI2012]永无乡的更多相关文章

  1. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  3. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

  4. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

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

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

  6. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

  7. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  8. [HNOI2012]永无乡 线段树合并

    [HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...

  9. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...

随机推荐

  1. js之BOM和DOM

      今天我们来学习js中的一些基础的操作. 一.BOM对象 BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相 ...

  2. css动画-小球撞壁反弹

    小球碰到一面壁之后一般都会反弹,反射角=入射角: 其实用css3来实现这个效果也非常简单. 首先,分解一下小球的运动:水平运动和垂直运动. 当小球往右下方向运动时,如果碰到了下面的壁,那么由于碰撞,小 ...

  3. wpf学习之(IValueConverter)

      学习IValueConverter的使用 public class StatuToNullableBoolConverter : IValueConverter { /// <summary ...

  4. nodejs请求中获取参数值的方法

    req.params.xxxxx 从path中的变量 req.query.xxxxx 从get中的?xxxx=中 req.body.xxxxx 从post中的变量

  5. Webstrom使用手册小记

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/10883350.html,多谢~=.= 1.从git上拉取项目 或者 2.切换分支(webstro ...

  6. SSH中懒加载异常--could not initialize proxy - no Session

    SSH进行关联的表进行显示时出现的问题,老是显示你的OGNL表达式错误,但是找了很久确实没错,在网上找了一下,下面的这个方法本人认为是最有效的方法(已经测试可以使用) 在web.xml中加入 程序代码 ...

  7. IOS segue(跳转页面处理)

    ● Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) Segue的属性 ● 每一个Segue对象,都有3个属性 ➢ 唯一标识 @prope ...

  8. POJ 1065 Wooden Sticks(LIS,最少链划分)

    题意:求二维偏序的最少链划分. 用到Dilworth定理:最少链划分=最长反链.(对偶也成立,个人认为区别只是一个维度上的两个方向,写了个简单的证明 相关概念:偏序集,链,反链等等概念可以参考这里:h ...

  9. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  10. iOS 闭包传值 和 代理传值

    let vc = ViewController() let navc = UINavigationController(rootViewController: vc) window = UIWindo ...