UVA11987 Almost Union-Find
题目描述
输入输出格式
输入格式:
输出格式:
输入输出样例
5 7
1 1 2
2 3 4
1 3 5
3 4
2 4 1
3 4
3 3
3 12
3 7
2 8
Solution:
本题平衡树。
考试的时候想到的就是无旋treap了,正解貌似是并查集(我没想出来,太菜了)。
节点维护子树大小和子树和,开始时每个节点就是一棵treap,因为我们并不要保证有序,所以可以直接按中序遍历维护,合并分离就不需要考虑优先级了。
对于操作一,若不在同一棵树中,直接merge两棵树。
对于操作二,因为随机键值树高为$\log n$,所以直接暴力往上跳到$x$所在树的根,跳的同时求出$x$在该树中的排名,若$x,y$不在同一棵树中,按排名将$x$分离出来,与$y$所在树合并。
对于操作三,直接找到$x$所在树根输出子树大小和子树和就好了。
代码:
/*Code by 520 -- 10.24*/
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int n,m,ch[N][],rnd[N],siz[N],date[N],cnt,fa[N],sum[N]; int gi(){
int a=;char x=getchar();
while(x<''||x>'') x=getchar();
while(x>=''&&x<='') a=(a<<)+(a<<)+(x^),x=getchar();
return a;
} il void newnode(int v){
++cnt;
ch[cnt][]=ch[cnt][]=,sum[cnt]=v;
siz[cnt]=,date[cnt]=v,rnd[cnt]=rand(),fa[cnt]=;
} il void up(int rt){
if(ch[rt][]) fa[ch[rt][]]=rt;
if(ch[rt][]) fa[ch[rt][]]=rt;
siz[rt]=siz[ch[rt][]]+siz[ch[rt][]]+;
sum[rt]=sum[ch[rt][]]+sum[ch[rt][]]+date[rt];
} int merge(int x,int y){
if(!x||!y) return x+y;
if(rnd[x]<rnd[y]) {ch[x][]=merge(ch[x][],y),up(x);return x;}
else {ch[y][]=merge(x,ch[y][]),up(y);return y;}
} void split(int rt,int v,int &x,int &y){
if(!rt) {x=y=;return;}
if(siz[ch[rt][]]>=v) y=rt,split(ch[rt][],v,x,ch[y][]),up(y);
else x=rt,split(ch[rt][],v-siz[ch[rt][]]-,ch[x][],y),up(x);
} int find(int x,int &tot){
if(!fa[x])return x;
if(ch[fa[x]][]==x) tot+=siz[ch[fa[x]][]]+;
return find(fa[x],tot);
} int main(){
srand(time());
while(scanf("%d%d",&n,&m)!=EOF){
cnt=; int opt,a,b,c,x,y,z;
For(i,,n) newnode(i);
while(m--){
opt=gi(),a=gi();
if(opt==){
b=gi();
a=find(a,x=),b=find(b,x=);
if(a!=b) merge(a,b);
}
else if(opt==){ int k=siz[ch[a][]]+;
b=gi();c=find(a,k),b=find(b,opt);
if(c!=b){
x=y=z=;
split(c,k,x,y),split(x,k-,x,z),x=merge(x,y),b=merge(b,z);
fa[x]=,fa[b]=;
}
}
else {
a=find(a,x=);
printf("%d %d\n",siz[a],sum[a]);
}
}
}
return ;
}
UVA11987 Almost Union-Find的更多相关文章
- SQL Server-聚焦UNIOL ALL/UNION查询(二十三)
前言 本节我们来看看有关查询中UNION和UNION ALL的问题,简短的内容,深入的理解,Always to review the basics. 初探UNION和UNION ALL 首先我们过一遍 ...
- SQL 提示介绍 hash/merge/concat union
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...
- LINQ to SQL语句(8)之Concat/Union/Intersect/Except
适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式: var q = ( from c in db ...
- SQLServer-----Union,Union All的使用方法
转载: http://blog.csdn.net/kiqinie/article/details/8132485 select a.Name from Material as a union sele ...
- 假如 UNION ALL 里面的子句 有 JOIN ,那个执行更快呢
比如: select id, name from table1 where name = 'x' union all select id, name from table2 where name = ...
- sql union和union all的用法及效率
UNION指令的目的是将两个SQL语句的结果合并起来.从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION的一个限制是两个 ...
- 【oracle】union、union all、intersect、minus 的用法及区别
一.union与union all 首先建两个view create or replace view test_view_1 as as c from dual union as c from dua ...
- sql with as union all
WITH RPL (FId,Fname,Forder) AS ( SELECT ment.deptno,ment.deptname,ment.orderno FROM JTERP..fg_depart ...
- Oracle 中 union 和union all 的简单使用说明
1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...
- LINQ系列:LINQ to SQL Concat/Union
1. Concat 单列Concat var expr = (from p in context.Products select p.ProductName) .Concat( from c in c ...
随机推荐
- 学习CSS布局 - position例子
position例子 通过具体的例子可以帮助我们更好地理解“position”.下面是一个真正的页面布局. 结果: 代码如下: <!DOCTYPE html> <html lang= ...
- 每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!
anmu 是一个开源的直播平台弹幕接口,使用他没什么基础的你也可以轻松的操作各平台弹幕.使用不到三十行代码,你就可以使用Python基于弹幕进一步开发.支持斗鱼.熊猫.战旗.全民.Bilibili多平 ...
- LVDS接口分类,时序,输出格式
LVDS接口分类,时序,输出格式 2016年01月19日 16:57:35 打个飞机去美国 阅读数:24673 标签: LVDS液晶屏格式时序 更多 个人分类: 硬件基础 1.1.1 ...
- DNS 协议
DNS 入门 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS 使用 T ...
- C#基础巩固(1)-多态+简单工厂
多态 如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行. 01代码 //父类 class Person { public virtual void skill ...
- C# 如何物理删除有主外键约束的记录?存储过程实现
十年河东,十年河西,莫欺少年穷 本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起! 下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下: CREATE TABLE ...
- Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结
一. 简单实例介绍一般来说,apache配置好http和https后,如果想要做http强转到https,需要设置url重定向规则,大致需要下面几个步骤即可完成配置: 1)在httpd.conf文件里 ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限.所以打算在这台2U服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求.当KVM ...
- C_数据结构_递归实现累加
# include <stdio.h> long sum(int n) { //用递归实现: ) ; else ) + n; /* 用for循环实现: long s = 0; int i; ...
- 安装tesserocr错误(未解决)
在win10下使用pip install tesserocr安装时,始终报错,未解决问题 解压tesserocr-2.2.2.tar.gz该文件夹后,查看setup.py文件,发现似乎model只能再 ...