poj3580 序列之王 fhqtreap
fhqtreap的写法 操作其实都差不多哇
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int M=;
- int read(){
- int ans=,f=,c=getchar();
- while(c<''||c>''){if(c=='-') f=-; c=getchar();}
- while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
- return ans*f;
- }
- int n,m,sum;
- struct node{
- node *l,*r;
- int sz,v,rnd,rev,tag,mn;
- void init(int w){sz=; v=w; rnd=rand(); mn=w;}
- void add(int w){tag+=w; v+=w; mn+=w;}
- void revs(){rev^=; swap(l,r);}
- void up(){
- sz=; mn=v;
- if(l) sz+=l->sz,mn=min(mn,l->mn);
- if(r) sz+=r->sz,mn=min(mn,r->mn);
- }
- void dn(){
- if(rev){if(l) l->revs(); if(r) r->revs(); rev=;}
- if(tag){if(l) l->add(tag); if(r) r->add(tag); tag=;}
- }
- void split(node*&lw,node*&rw,int k){
- if(!this){lw=; rw=; return ;}
- dn();
- int ls=l?l->sz:;
- if(ls>=k){
- l->split(lw,l,k);
- rw=this;
- }
- else{
- r->split(r,rw,k-ls-);
- lw=this;
- }
- up();
- }
- }tr[M],*rt;
- node *merge(node *a,node *b){
- if(!a) return b;
- if(!b) return a;
- if(a->rnd>b->rnd){
- a->dn();
- a->r=merge(a->r,b);
- a->up();
- return a;
- }{
- b->dn();
- b->l=merge(a,b->l);
- b->up();
- return b;
- }
- }
- int main()
- {
- int l,r,w;
- char ch[];
- n=read();
- for(int i=;i<=n;i++) w=read(),tr[i].init(w),rt=merge(rt,tr+i);
- sum=n; m=read();
- while(m--){
- scanf("%s",ch);
- if(ch[]=='A'){
- node *p1,*p2,*p3;
- l=read(); r=read(); w=read();
- rt->split(p2,p3,r);
- p2->split(p1,p2,l-);
- p2->add(w);
- rt=merge(merge(p1,p2),p3);
- }
- else if(ch[]=='M'){
- node *p1,*p2,*p3;
- l=read(); r=read();
- rt->split(p2,p3,r);
- p2->split(p1,p2,l-);
- printf("%d\n",p2->mn);
- rt=merge(merge(p1,p2),p3);
- }
- else if(ch[]=='R'&&ch[]=='R'){
- node *p1,*p2,*p3;
- l=read(); r=read();
- if(l==r) continue;
- rt->split(p2,p3,r);
- p2->split(p1,p2,l-);
- p2->revs();
- rt=merge(merge(p1,p2),p3);
- }
- else if(ch[]=='O'){
- node *p1,*p2,*p3,*p4;
- l=read(); r=read(); w=read()%(r-l+);
- if(l==r) continue;
- rt->split(p2,p4,r);
- p2->split(p1,p2,l-);
- p2->split(p2,p3,r-w-l+);
- rt=merge(merge(p1,p3),merge(p2,p4));
- }
- else if(ch[]=='I'){
- node *p1,*p2;
- l=read(); w=read();
- tr[++sum].init(w);
- rt->split(p1,p2,l);
- rt=merge(merge(p1,tr+sum),p2);
- }
- else if(ch[]=='D'){
- node *p1,*p2,*p3;
- l=read();
- rt->split(p2,p3,l);
- p2->split(p1,p2,l-);
- rt=merge(p1,p3);
- }
- }
- return ;
- }
poj3580 序列之王 fhqtreap的更多相关文章
- 洛谷 P3215 [HNOI2011]括号修复 / [JSOI2011]括号序列(fhq-treap)
题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变 ...
- bzoj1251: 序列终结者 fhqtreap写法
fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...
- Splay 的区间操作
学完Splay的查找作用,发现和普通的二叉查找树没什么区别,只是用了splay操作节省了时间开支. 而Splay序列之王的称号可不是白给的. Splay真正强大的地方是他的区间操作. 怎么实现呢? 我 ...
- Splay平衡树入门小结
学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...
- Splay浅谈
Splay是众多平衡树之一,它的功能十分强大,但常数极大.在LCT和许多数据结构中都能用到. Splay的核心操作,就是rotate.为了使树不是一条链,而是平衡的,我们需要旋转来维护形态.理论很简单 ...
- [数据结构-平衡树]普通 FHQ_Treap从入门到精通(注释比代码多系列)
普通 FHQ_Treap从入门到精通(注释比代码多系列) 前提说明,作者写注释太累了,文章里的部分讲解来源于Oi-wiki,并根据代码,有部分增改.本文仅仅发布于博客园,其他地方出现本文,均是未经许可 ...
- 【FHQ-Treap】P4146 序列终结者
题意: 给定一个序列,支持区间加,区间反转,区间max询问 裸的平衡树题,这里采用FHQ-Treap 每个节点多记录一个max值和两个lazy_tag,暴力Push_Down即可(大常数选手) 打完这 ...
- bzoj 1251: 序列终结者 平衡树,fhqtreap
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...
- Poj3580 Super Memo(FHQ-Treap)
题面 题解 对于操作$1$,我们可以对于每个节点打一个$add$标记,下放就行了 对于操作2,可以参考这篇题解的上一篇,不赘述 对于操作4,可以将区间裂成两部分,然后再插入合并 对于操作5,可以将区间 ...
随机推荐
- 【个人训练】(UVa11129)An antiarithmetic permutation
题意与解析 一条非常有趣的二分题.一开始没有懂解法,去网上看了半天全是做法没有这样做为什么是对的(或者说的很含糊).一做完回顾一下立刻有点开朗的感觉. 题意很简单,维护一个0-n-1的数列,使其选出长 ...
- 【题解搬运】PAT_A1016 Phone Bills
从我原来的博客上搬运.原先blog作废. 题目 A long-distance telephone company charges its customers by the following rul ...
- ubuntu 把软件源修改为国内源
国内有很多Ubuntu的镜像源,比如:阿里源.网易源等,还有很多教育网的源,比如:清华源.中科大源等. 这里以清华源为例讲解如何修改Ubuntu 18.04里面默认的源. 修改步骤 第一步:备份原始源 ...
- tensorflow的几种优化器
最近自己用CNN跑了下MINIST,准确率很低(迭代过程中),跑了几个epoch,我就直接stop了,感觉哪有问题,随即排查了下,同时查阅了网上其他人的blog,并没有发现什么问题 之后copy了一篇 ...
- PHP中的6种加密方式
PHP中的6种加密方式 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串. raw ...
- RMQ问题+ST算法
一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...
- eclipse版本命名规则与其他软件命名
文章:Eclipse各版本代号一览表 eclipse使用星球.神话人物.元素名称作为命名代号. 所以思路要放宽,不要拘泥于已有经验. java是用咖啡命名的: python中文意思是蟒蛇: 不拘泥于已 ...
- HashMap和Hashtable的区别(转载)
转载声明:转载自原文http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是 ...
- 【SSH】——Hibernate三种状态之间的转化
Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...
- ES 1.7安装ik分词elasticsearch-analysis-ik-1.2.5
IK简介 https://www.cnblogs.com/yjf512/p/4789239.html https://www.cnblogs.com/xing901022/p/5910139.html ...