博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2733 线段树的合并 并查集
阅读量:6202 次
发布时间:2019-06-21

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

思路:

1.线段树合并(nlogn的)
2.splay+启发式合并

线段树合并比较好写

我手懒

//By SiriusRen#include 
#include
#include
using namespace std;const int N=100050;int n,m,q,a[N],f[N],xx,yy,son[N*50][2],tr[N*50],root[N],cnt,rev[N];char op[10];int find(int x){
return x==f[x]?x:f[x]=find(f[x]);}void push_up(int x){
tr[x]=tr[son[x][0]]+tr[son[x][1]];}void insert(int &x,int l,int r,int wei){ if(!x)x=++cnt; if(l==r){
tr[x]++;return;} int mid=(l+r)>>1; if(mid
>1; if(tr[son[x][0]]>=num)return query(son[x][0],l,mid,num); return query(son[x][1],mid+1,r,num-tr[son[x][0]]);}void add(){ int fx=find(xx),fy=find(yy); if(fx!=fy)root[fx]=merge(root[fx],root[fy]),f[fy]=fx; }int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]),f[i]=i,insert(root[i],1,n,a[i]),rev[a[i]]=i; while(m--)scanf("%d%d",&xx,&yy),add(); scanf("%d",&q); while(q--){ scanf("%s%d%d",op,&xx,&yy); if(op[0]=='Q')printf("%d\n",tr[root[find(xx)]]

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532046.html

你可能感兴趣的文章
curl 错误总结
查看>>
vue-cli3 创建项目报”asyncWrite is not a function“错误的解决方法
查看>>
启动页
查看>>
[开源]KJFramework.Message 高性能二进制消息框架 - 多元素数组的高性能优化
查看>>
自用获取数据函数封装
查看>>
生产环境MySQL优化
查看>>
beanstalkd的安装
查看>>
转发一篇学生的心得
查看>>
分布式事务处理方法论
查看>>
AlwaysOn 同步时间的测试
查看>>
按键精灵执行自动化测试用例过程中,如有异常,如何抛出异常?
查看>>
springmvc不进入Controller导致404
查看>>
MyBatis3配置文件示例及解释
查看>>
4.JasperReports学习笔记4-查询数据库生成动态的报表(WEB)
查看>>
Struts2 文件上传 之 文件类型 allowedTypes
查看>>
Transaction rolled back because it has been marked as rollback-only
查看>>
java中urlrewrite的配置和使用
查看>>
创建spring自定义注解进行自动装配
查看>>
modernizr的介绍和使用
查看>>
DataSet单元格操作
查看>>