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

Description:

n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛。现在有两种操作:B x y表示在岛 x与岛y之间修建一座新桥。Q x k表示询问当前与岛 x连通的所有岛中第k重要的是哪座岛,即所有与岛 x连通的岛中重要度排名第 k小的岛是哪座,请你输出那个岛的编号。

对于100%的数据n≤100000,m≤n,q≤300000。

分析:读懂题后发现是一道线段树合并的裸题。Q操作显然是权值线段树求区间第k小元素,B操作是合并。

直接开发现开不下,需要动态开点,一开始要开nlogn个结点。

合并操作:

int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
lson[x]=merge(lson[x],lson[y]);
rson[x]=merge(rson[x],rson[y]);
t[x]=t[lson[x]]+t[rson[x]];
return x;
}

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=3262145;
int tree[N],lson[N],rson[N],t[N],mp[N],fa[N],idx[N],cnt;
int n,m,k;
char s[10];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void bt(int l,int r,int val,int &pos)
{
if(pos==0)pos=++cnt;
if(l==r)
{
t[pos]=1;
return ;
}
int mid=l+r>>1;
if(val<=mid)bt(l,mid,val,lson[pos]);
else bt(mid+1,r,val,rson[pos]);
t[pos]=t[lson[pos]]+t[rson[pos]];
}
int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
lson[x]=merge(lson[x],lson[y]);
rson[x]=merge(rson[x],rson[y]);
t[x]=t[lson[x]]+t[rson[x]];
return x;
}
int query(int l,int r,int k,int pos)
{
if(l==r||k==0)
{
return mp[l];
}
int mid=l+r>>1;
if(t[pos]<k)return -1;
if(t[lson[pos]]>=k)
{
return query(l,mid,k,lson[pos]);
}
else
{
return query(mid+1,r,k-t[lson[pos]],rson[pos]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&idx[i]);
mp[idx[i]]=i;
}
for(int i=1;i<=n;i++)
{
tree[i]=++cnt;
bt(1,n,idx[i],tree[i]);
}
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
int dx=find(x),dy=find(y);
if(dx!=dy)
{
fa[dy]=dx;
tree[dx]=merge(tree[dx],tree[dy]);
}
}
scanf("%d",&k);
while(k--)
{
scanf("%s%d%d",s,&x,&y);
int dx=find(x);
if(s[0]=='Q')
{
printf("%d\n",query(1,n,y,tree[dx]));
}
else
{
int dx=find(x),dy=find(y);
if(dx!=dy)
{
fa[dy]=dx;
tree[dx]=merge(tree[dx],tree[dy]);
}
}
}
}

B20J_2733_[HNOI2012]永无乡_权值线段树合并的更多相关文章

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

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

  2. BZOJ2733 [HNOI2012]永无乡(并查集+线段树合并)

    题目大意: 在$n$个带权点上维护两个操作: 1)在点$u,v$间连一条边: 2)询问点$u$所在联通块中权值第$k$小的点的编号,若该联通块中的点的数目小于$k$,则输出$-1$: 传送门 上周的模 ...

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

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

  4. BZOJ_2161_布娃娃_权值线段树

    BZOJ_2161_布娃娃_权值线段树 Description 小时候的雨荨非常听话,是父母眼中的好孩子.在学校是老师的左右手,同学的好榜样.后来她成为艾利斯顿第二 代考神,这和小时候培养的良好素质是 ...

  5. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  6. BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树

    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的 工资. ...

  7. 【bzoj1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+权值线段树合并

    题目描述 求一张图的严格次小生成树的边权和,保证存在. 输入 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z ...

  8. 【bzoj4719】[Noip2016]天天爱跑步 权值线段树合并

    题目描述 给出一棵n个点的树,以及m次操作,每次操作从起点向终点以每秒一条边的速度移动(初始时刻为0),最后对于每个点询问有多少次操作在经过该点的时刻为某值. 输入 第一行有两个整数N和M .其中N代 ...

  9. 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并

    原文地址:http://www.cnblogs.com/GXZlegend/p/6826614.html 题目描述 Byteasar the gardener is growing a rare tr ...

随机推荐

  1. 智能合约最佳实践 之 Solidity 编码规范

    每一门语言都有其相应的编码规范, Solidity 也一样, 下面官方推荐的规范及我的总结,供大家参考,希望可以帮助大家写出更好规范的智能合约. 命名规范 避免使用 小写的l,大写的I,大写的O 应该 ...

  2. java泛型应用实例 - 自定义泛型类,方法

    近 短时间需要使用泛型,就研究了下,发现网上的问关于泛型的文章都是讲原理的, 很少有提到那里用泛型比较合适, 本文就泛型类和泛型方法的使用给出两 个典型应用场景. 例如一个toString的泛型方法, ...

  3. Servlet 学习总结

    Servlet资料整理[很全很强大] 分类: J2EE2009-10-23 00:51 671人阅读 评论(0) 收藏 举报 servletsessionstring服务器initialization ...

  4. 【CloverETL培训】题目

    具体要求: 导入: 1.在CRM中,创建相应物理表,存储Follow/Binding记录.openid作为逻辑主键 2.Follow/Binding导入相互不影响,一个失败另外一个继续执行 3.Fol ...

  5. 体育Bank2016会议笔记

    补注:会议全称应该是体育Bank2016体育投融资总裁年会 新华社体育部徐仁基 演讲主题:帮郭川找到大海-->帮民众找到自己真正的体育爱好 激发和培养体育市场是重中之重 将体育培养成生活习惯.生 ...

  6. React+ANTD项目使用后的一些关于生命周期比较实用的心得

    1. constructor() constructor(props){ super(props) this.state=({ }) } 一定先写super  可以接收从父组件传来的值 父组件往子组件 ...

  7. EF Linq中的左连接Left Join查询

    linq中的join是inner join内连接,就是当两个表中有一个表对应的数据没有的时候那个关联就不成立. 比如表A B的数据如下 from a in A join b in B on a.BId ...

  8. python笔记:#007#变量

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  9. oracle 触发器,当一个表更新或插入时将数据同步至另个库中的某个表中

    有两个表分别是 A用户下的 T_SRC_WEATHER_TSPG字段如图, B用户下的t_src_weather 表,如图: 要求,当A用户下的T_SRC_WEATHER_TSPG表有插入或者更新数据 ...

  10. centOS7虚拟环境搭建

    今天来记录一下使用WMware虚拟机来搭建centOS虚拟机的过程. 本次使用工具为VMware Workstation 14 Pro,可以从https://www.vmware.com/来获取所需工 ...