题目大意:

经黄学长指出,此题原题出自2014湖北省队互测 没有人的算术

规定集合由二元组(A,B)构成,A、B同时也是两个这样的集合,即A、B本身也是二元组

规定二元组S为严格最小集合,S=(S,S),规定T为严格最大集合T=(T,T)

刚开始我们有两个集合S和T,即全局最小集合和全局最大集合,编号分别为0,n+1

下面我们规定集合的比较规则,是递归定义的

我们称集合X(X1,X2)等于Y(Y1,Y2)当且仅当

X1=Y1 并且 X2=Y2

我们称集合X(X1,X2)小于Y(Y1,Y2)当且仅当

1.X1<Y1

2.X1==Y1 且 X2<Y2

现在有n个操作:

1.将集合u、v合并为新二元组集合X(u,v)

2.输出所有小于或等于X的集合数量

输入

第一行一个整数n,代表有n个操作

下面n行,每行2个数u、v代表将集合u、v组合成新的集合

输出

共n行,每行一个整数,代表当前全集中小于或等于当前新生成集合的数量

样例输入


样例输出


Solution

orz神犇wwx

法一:

先考虑最暴力的做法,那就是O(n*n)的递归比较

得分10

法二:

考虑将集合维护成一个有序序列,用插入排序O(n)解决一个点的插入,就可以O(1)得出答案,比较就是比数组下标就行了哦

得分30

法三:

显然可以用平衡树维护大小关系嘛,把原来数组变成一个映射,将下标映射到区间[0,oo)上记为Val,其中S取0,T去oo,插入时,若集合X大小在A、B间,则Val(X)=(Val(A)+Val(B))/2

那么,每次插入后为了维护Val,就要重构遍平衡树

得分100

下面是标解

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define MaxN 50010
#define MaxBuf 1<<22
#define inf LONG_LONG_MAX/2
#define mid ((l>>1)+(r>>1)+(l&r&1))
#define RG register
#define inline __inline__ __attribute__((always_inline))
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++) char B[MaxBuf],*S=B,*T=B; template<class Type>inline void Rin(RG Type &x){
x=;RG int c=Blue();RG bool b=false;
for(;c<||c>;c=Blue())
if(c==)b=true;
for(;c>&&c<;c=Blue())
x=(x<<)+(x<<)+c-;
if(b)x=-x;
} int n,ans;
struct Treap{
#define L long long
struct Nt{
Nt *ch[],*s1,*s2;
int size,k;
L v; inline void pud() {size=ch[]->size+ch[]->size+;}
}pool[MaxN],*null,*root,*Re_p; L Re_s,Re_t; inline void rotate(RG Nt *&o,RG bool d){
RG Nt *k=o->ch[d];
o->ch[d]=k->ch[!d];
k->ch[!d]=o;
o->pud();
k->pud();
o=k;
} void insert(RG Nt *&o,RG Nt *p,RG L l,RG L r){
if(o==null){
o=p;
p->k=rand()*+rand(); p->v=mid; p->size=;
printf("%d\n",ans);
return;
}
RG bool d=(p->s1->v > o->s1->v) || (p->s1->v == o->s1->v && p->s2->v >= o->s2->v);
d? (ans+=o->ch[]->size+,insert(o->ch[],p,o->v+,r)):(insert(o->ch[],p,l,o->v-));
if(o->ch[d]->k < o->k)rotate(o,d),Re_p=o,Re_s=l,Re_t=r;
o->pud();
} void Relabel(Nt *o,L l,L r){
if(o==null)return;
o->v=mid;
Relabel(o->ch[],l,o->v-);
Relabel(o->ch[],o->v+,r);
}
public:
void init(){
root=null=pool+n+;
null->ch[]=null->ch[]=null;
pool->v=;
(pool+n+)->v=inf+;
} inline void insert(RG int cnt,RG int u,RG int v){
ans=;
pool[cnt].s1=pool+u;
pool[cnt].s2=pool+v;
pool[cnt].ch[]=pool[cnt].ch[]=null;
Re_p=null;
insert(root,pool+cnt,,inf);
Relabel(Re_p,Re_s,Re_t);
}
}RT; #define set_file(File) {freopen(#File".in","r",stdin); freopen(#File".out","w",stdout);}
#define close_file() {fclose(stdin); fclose(stdout);} int main(){
srand('K'+'a'+'i'+'b'+'a'); set_file(comparison); Rin(n); RT.init();
for(RG int i=,u,v;i<=n;i++){
Rin(u),Rin(v);
RT.insert(i,u,v);
} close_file(); return ;
}

FJoi2017 1月21日模拟赛 comparison(平衡树+thita重构)的更多相关文章

  1. FJoi2017 1月20日模拟赛 恐狼后卫(口糊动规)

    Problem 1 恐狼后卫(wolf.cpp/c/pas) [题目描述] 著名卡牌游戏<石炉传说>中有一张随从牌:恐狼后卫.恐狼后卫的能力是使得相邻随从的攻击力提高. 现在有n张恐狼后卫 ...

  2. FJoi2017 1月20日模拟赛 直线斯坦纳树(暴力+最小生成树+骗分+人工构造+随机乱搞)

    [题目描述] 给定二维平面上n个整点,求该图的一个直线斯坦纳树,使得树的边长度总和尽量小. 直线斯坦纳树:使所有给定的点连通的树,所有边必须平行于坐标轴,允许在给定点外增加额外的中间节点. 如下图所示 ...

  3. FJoi2017 1月20日模拟赛 交错和(等差数列+rmq)

    [题目描述] 无限循环数字串S由长度为n的循环节s构成.设s为12345(n=5),则数字串S为123451234512345… 设Si为S的第i位数字,在上面的例子中,S1=1,S2=2,S6=1. ...

  4. 2016年12月21日 星期三 --出埃及记 Exodus 21:16

    2016年12月21日 星期三 --出埃及记 Exodus 21:16 "Anyone who kidnaps another and either sells him or still h ...

  5. 2016年11月21日 星期一 --出埃及记 Exodus 20:12

    2016年11月21日 星期一 --出埃及记 Exodus 20:12 "Honor your father and your mother, so that you may live lo ...

  6. 2016年10月21日 星期五 --出埃及记 Exodus 19:5

    2016年10月21日 星期五 --出埃及记 Exodus 19:5 Now if you obey me fully and keep my covenant, then out of all na ...

  7. 成都Uber优步司机奖励政策(2月21日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 长沙4月21日开发者大会暨.NET社区成立大会活动纪实

    活动总结 2019年4月21日是一个斜风细雨.微风和煦的美好日子,由长沙.NET技术社区.腾讯云云加社区.微软Azure云技术社区.中国.NET技术社区.长沙柳枝行动.长沙互联网活动基地(唐胡子俱乐部 ...

  9. 【12月21日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2018年12月21日 之间,滚动市盈率历史新低排名.上市三年以上的公司,2018年12月21日市盈率在300以下的公司. 1 - 厦门象屿(SH600057) - 历史新 ...

随机推荐

  1. bzoj 1782: [Usaco2010 Feb]slowdown 慢慢游【dfs序+线段树】

    考虑每头牛到达之后的影响,u到达之后,从1到其子树内的点需要放慢的都多了一个,p为u子树内点的牛ans会加1 用线段树维护dfs序,每次修改子树区间,答案直接单点查询p即可 #include<i ...

  2. [App Store Connect帮助]六、测试 Beta 版本(3.2)管理测试员:邀请外部测试员

    在您上传至少一个构建版本之后,您可以邀请外部测试员(您组织之外的人员)使用“TestFlight Beta 版测试”来测试您的 App.为了使您的构建版本可用于外部测试,请创建一个群组.添加构建版本, ...

  3. CodeIgnitor 配置类的使用

    CI 的配置文件统一放在 application/config/ 目录下面,框架有一个默认的主配置文件 application/config/config.php.其部分内容如下: <?php ...

  4. 讯搜问题排查xunsearch

    mysql导入数据不成功,开始重建索引后提示 [XSException] ../local/xunsearch/sdk/php/lib/XS.php(1898): DB- 可打印的版本 开始重建索引 ...

  5. 'latin-1' codec can't encode characters in position解决字符问题

    当遇到这样的报错时,原因是: pymysql库在处理mysql语句时,默认的编码方式是'latin-1',这种编码方式能识别的字符是有限的 解决办法:找到\site-packages\pymysql\ ...

  6. 429c Leha and Function

    题目 解题报告 F(n, k)是在集合{1, 2, 3, ..., n}中所有的具有k个元素的子集中分别取最小值,相加后的期望. 例如:要求F(4, 2),根据定义有{1, 2}, {1, 3}, { ...

  7. TCP/IP与Http与socket的关系

    1 理清概念: TCP/IP是一个大的协议族(只不过TCP和IP是super star所以就这么命名了),它包括了: 应用层协议:FTP.HTTP.TELNET.SMTP.DNS(协议): 传输层协议 ...

  8. Asp 循环输出 form 表单提交的数据

    亲测asp提交form表单数据,在接收页面循环输出数据 dim var for each var in request.form response.write var&"=" ...

  9. Log4Net学习笔记(1)-完整的例子

    一.开发环境 编译器:VS2013 .Net版本:4.5 二.开发流程 1.从nuget上获取log4net 2.配置log4net的配置文件 <?xml version="1.0&q ...

  10. quartz在集群环境下的最终解决方案

    在集群环境下,大家会碰到一直困扰的问题,即多个 APP 下如何用 quartz 协调处理自动化 JOB . 大家想象一下,现在有 A , B , C3 台机器同时作为集群服务器对外统一提供 SERVI ...