博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2733: [HNOI2012]永无乡
阅读量:5116 次
发布时间:2019-06-13

本文共 1592 字,大约阅读时间需要 5 分钟。

BZOJ2733: [HNOI2012]永无乡


题目描述

题目分析

题目要求合并集合和查询某个集合中的第\(k\)大,发现线段树合并可以做。

又有一个非常好的性质,一个权值对应唯一的一个位置,所以在权值线段树上直接在相应权值打上标记,查询的时候直接查询到底,合并直接上线段树合并,就可以了。

是代码呢

#include 
using namespace std;const int MAXN=1e5+7;#define mid ((l+r)>>1)int f[MAXN],st[MAXN<<5],L[MAXN<<5],R[MAXN<<5],T[MAXN],n,m,fa[MAXN<<5],sz,a[MAXN],q;char opt[2];inline int read(){ int x=0,c=1; char ch=' '; while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); while(ch=='-')c*=-1,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*c;}inline int find(int x) {return f[x]==x?f[x]:f[x]=find(f[x]);}inline int query(int x,int k){ if(st[x]
=k) modify(L[u],l,mid,k,x); else modify(R[u],mid+1,r,k,x); st[u]=st[L[u]]+st[R[u]];// if(!R[u]) fa[u]=fa[L[u]];else fa[u]=fa[R[u]];}inline void merge(int &u,int v){ if(!u||!v){u+=v;return;} st[u]+=st[v]; merge(L[u],L[v]);merge(R[u],R[v]);}int main(){ n=read();m=read(); for(int i=1;i<=n;i++) a[i]=read(),f[i]=i; for(int i=1;i<=n;i++) modify(T[i],1,n,a[i],i); for(int i=1;i<=m;i++){ int x=read(),y=read(); int r1=find(x),r2=find(y); if(r1==r2) continue; f[r2]=r1; merge(T[r1],T[r2]); } q=read(); while(q--){ scanf("%s",opt); int x=read(),y=read(); if(opt[0]=='B'){ int r1=find(x),r2=find(y); if(r1==r2) continue; f[r2]=r1; merge(T[r1],T[r2]); } else { int d=find(x); printf("%d\n",query(T[d],1,n,y)); } }}

转载于:https://www.cnblogs.com/victorique/p/10556693.html

你可能感兴趣的文章
SQL中取得时间的一些技巧
查看>>
Redis内存使用优化与存储
查看>>
一些技术文章
查看>>
android提示框
查看>>
一个小问题引发的思考
查看>>
WPF自学入门(十一)WPF MVVM模式Command命令
查看>>
Oracle篇 之 子查询
查看>>
zzuli 1907: 小火山的宝藏收益
查看>>
nodejs 中的一些方法
查看>>
R_Studio读取xls文件
查看>>
oralce中的dual详解 转 http://blog.sina.com.cn/s/blog_a5a24bcb0100zeay.html
查看>>
hdu 1181 变形课
查看>>
第三章软件工程基础
查看>>
文件描述符、文件表项指针、inode节点的关系
查看>>
新手必看的jQuery优化笔记十则
查看>>
博客园何时会被简书们超越
查看>>
Python模拟登录练习
查看>>
【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月
查看>>
Error accessing PRODUCT_USER_PROFILE
查看>>
Spring mvc 特殊字段的注入
查看>>