正题

题目链接:http://www.ybtoj.com.cn/problem/652


题目大意

定义一个元素为一个有序集合包含两个元素C={A,B}C=\{A,B\}C={A,B}
集合C={A,B}C=\{A,B\}C={A,B}的大小以AAA为第一关键字,BBB为第二关键字比较大小。
开始有两个元素S={S,S},T={T,T}S=\{S,S\},T=\{T,T\}S={S,S},T={T,T}且S<TS<TS<T。

然后nnn次加入一个新的由两个之前的元素依次组成的新元素,求出现过的元素小于等于它的有多少个。

1≤n≤5×1041\leq n\leq 5\times 10^41≤n≤5×104


解题思路

如果递归比较是O(n)O(n)O(n)的显然不行,但是我们比较新的元素和旧的元素大小的时候如果我们可以知道以前元素的大小关系就可以快速比较(因为新的元素由旧的元素组成)

所以相当于我们要动态维护大小关系,因为要插入好像只能用平衡树。

然后要在树上查询两个点的大小关系,因为你要在平衡树上边移动边查询,所以不能用查询的时候结构会改变的平衡树(SplaySplaySplay之类的,虽然原本SplaySplaySplay是最方便的),正解是替罪羊的,反正这里用了TreapTreapTreap。

比较大小的时候直接在TreapTreapTreap上暴力跳找LCALCALCA就好了,深度是logloglog级别的,然后不能动态维护深度所以有点麻烦

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=51000;
int n,qfn,tot,a[N],b[N],p[N],v[N];
int t[N][2],siz[N],cnt[N],dat[N],fa[N];
int cmp(int x,int y){++qfn;if(x==y)return 2;while(x){if(fa[x]==y)return t[y][0]==x;v[x]=qfn;x=fa[x];}while(y){if(v[fa[y]]==qfn)return t[fa[y]][1]==y;y=fa[y];}return 0;
}
int cap(int x,int y){int tmp=cmp(a[x],a[y]);if(tmp!=2)return tmp;return cmp(b[x],b[y]);
}
void PushUp(int x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+cnt[x];return;
}
void zig(int &x){int y=t[x][0];t[x][0]=t[y][1];fa[t[y][1]]=x;t[y][1]=x;fa[y]=fa[x];fa[x]=y;x=y;PushUp(t[x][1]);PushUp(x);return;
}
void zag(int &x){int y=t[x][1];t[x][1]=t[y][0];fa[t[y][0]]=x;t[y][0]=x;fa[y]=fa[x];fa[x]=y;x=y;PushUp(t[x][0]);PushUp(x);return;
}
void Insert(int &x,int pos){if(!x){x=++tot;p[pos]=x;a[tot]=a[pos];b[tot]=b[pos];cnt[x]=siz[x]=1;dat[x]=rand();return;}int tmp=cap(pos,x),sum=0;if(tmp==2){p[pos]=x;cnt[x]++;PushUp(x);return;}else if(tmp){Insert(t[x][0],pos);fa[t[x][0]]=x;if(dat[t[x][0]]>dat[x])zig(x);}else{Insert(t[x][1],pos);fa[t[x][1]]=x;if(dat[t[x][1]]>dat[x])zag(x);}PushUp(x);return;
}
int Query(int x){int ans=siz[t[x][0]]+cnt[x];while(x){if(t[fa[x]][0]!=x)ans+=siz[t[fa[x]][0]]+cnt[fa[x]];x=fa[x];}return ans;
}
int main()
{//  freopen("comparison.in","r",stdin);
//  freopen("comparison.out","w",stdout);srand(19260817);scanf("%d",&n);n++;t[1][1]=n+1;p[1]=1;a[1]=b[1]=1;p[n+1]=n+1;a[n+1]=b[n+1]=n+1;cnt[1]=cnt[n+1]=1;fa[n+1]=tot=1;PushUp(n+1);PushUp(1);int rt=1;for(int i=2;i<=n;i++){scanf("%d%d",&a[i],&b[i]);a[i]++;b[i]++;a[i]=p[a[i]];b[i]=p[b[i]];Insert(rt,i);printf("%d\n",Query(p[i]));}return 0;
}

YbtOJ#652-集合比较【Treap】相关推荐

  1. 【bzoj2555】Substring【后缀平衡树入门】

    传送门 (bzoj上不去我也很无奈啊) 题意:维护一个字符串,支持后面加字符串,给定串询问出现次数.强制在线. 数据范围:暴力跑不过 前置知识:重量平衡树 众所周知,平衡树都用了一些策略保证平衡. 平 ...

  2. 数据结构之Treap

    1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap ...

  3. [POI2008] Poc (原名 Trians) Treap+Hash

    这个题和千山鸟飞绝体现出了一种用平衡树解决动态集合问题,主要套路就是蜜汁标记. 这个题我一开始用替罪羊树搞了一下对了28个点,后来我换成了Treap一搞对了14个点,再后来发现被卡了Hash我竟然在自 ...

  4. Java集合—TreeMap底层原理

    原文出自:http://cmsblogs.com/?p=1013.尊重作者的成果,转载请注明出处! 个人站点:http://cmsblogs.com TreeMap的实现是红黑树算法的实现,所以要了解 ...

  5. Java集合--TreeMap

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 TreeM ...

  6. 对 Redis 中的有序集合SortedSet的理解

    本篇说一下Redis中的 有序集合类型,曾几何时,我们想把所有数据存到内存中的 数据结构 中,但为了多机器共享内存,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,烦心事太多太多...后 ...

  7. [2021-09-02 contest]CF1251C,可达性统计(bitset优化dp),Boomerang Tournament(状压dp),小蓝的好友(mrx)(treap平衡树)

    文章目录 CF1251C Minimize The Integer acwing164:可达性统计 Facebook Hacker Cup 2016 Round 1 Boomerang Tournam ...

  8. YbtOJ#791-子集最值【三维偏序】

    正题 题目链接:http://www.ybtoj.com.cn/contest/123/problem/1 题目大意 给出333个长度为nnn的排列A,B,CA,B,CA,B,C.然后一个下标集合SS ...

  9. YbtOJ#883-最大的割【带修线性基】

    正题 题目链接:http://www.ybtoj.com.cn/contest/118/problem/3 解题思路 给出nnn个点,mmm次动态插入一条无向边询问:割掉一些边使得图中至少两点不连通, ...

最新文章

  1. POJ2985 The k-th Largest Group(平衡树查询第K大)
  2. QT中使用QSettings保存应用程序配置信息
  3. 码农口述:AI创业两年,积蓄花光,重回职场敲代码
  4. 【⭐C/C++の深入浅出⭐】int数与多枚举值互转
  5. stm32 无符号整形_十进制字符串转化为无符号整数
  6. python数据分享人力资源_Python数据分析帮你清晰的了解整理员工们的工作效率和整体满意度...
  7. 平板游戏问题(luogu 2003/2018 特长生 T4)
  8. iOS工作中的经验总结—马甲包审核以及常见审核问题
  9. 碧蓝航线维护服务器时间,碧蓝航线3月21日维护时间更新公告 新增与更改内容介绍...
  10. ASP.NET自动回发的内幕
  11. 计算机组成原理中wr是什么,计算机组成原理第8章习题指导.pdf
  12. 2022新考纲408计组详细思维导图分享
  13. 建站之星v2.7快速更换模版
  14. 【一起学数据结构与算法分析】第二篇:字谜游戏
  15. python所有字母大写_在python中将所有字母改为大写
  16. FFMPEG框架学习——(2)视频的提取和解码
  17. 去除字符串中所有的空格
  18. 阿里云 - MaxCompute研究
  19. 安装vscode,下载很慢的解决
  20. 松川仪表IPO被终止:年营收2.58亿 林茂波夫妇控制77%股权

热门文章

  1. 中科大计算机博士毕业条件,中国科技大学博士和硕士研究生毕业要求.doc
  2. wince导航_宁可用手机导航,也不用汽车导航?
  3. 猴子偷桃php代码,C++实现猴子吃桃的示例代码
  4. java enum优点_你需要关注的 Java Enum 枚举的几个细节
  5. U盘安装Linux挂载cd,U盘安装Ubuntu Server CD-ROM挂载失败
  6. php如何将页面嵌入在另一盒子里,如何将一个盒子在显示在浏览器的正中间_html/css_WEB-ITnose...
  7. 用matlab算24点小游戏,24点游戏的Matlab程序
  8. java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...
  9. 个人博客前端模板_腾讯前端开发工程师,教你极速搭建一个个人博客网站
  10. 高等数学下-赵立军-北京大学出版社-题解-练习12.3