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的更多相关文章

  1. 洛谷 P3215 [HNOI2011]括号修复 / [JSOI2011]括号序列(fhq-treap)

    题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变 ...

  2. bzoj1251: 序列终结者 fhqtreap写法

    fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...

  3. Splay 的区间操作

    学完Splay的查找作用,发现和普通的二叉查找树没什么区别,只是用了splay操作节省了时间开支. 而Splay序列之王的称号可不是白给的. Splay真正强大的地方是他的区间操作. 怎么实现呢? 我 ...

  4. Splay平衡树入门小结

    学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...

  5. Splay浅谈

    Splay是众多平衡树之一,它的功能十分强大,但常数极大.在LCT和许多数据结构中都能用到. Splay的核心操作,就是rotate.为了使树不是一条链,而是平衡的,我们需要旋转来维护形态.理论很简单 ...

  6. [数据结构-平衡树]普通 FHQ_Treap从入门到精通(注释比代码多系列)

    普通 FHQ_Treap从入门到精通(注释比代码多系列) 前提说明,作者写注释太累了,文章里的部分讲解来源于Oi-wiki,并根据代码,有部分增改.本文仅仅发布于博客园,其他地方出现本文,均是未经许可 ...

  7. 【FHQ-Treap】P4146 序列终结者

    题意: 给定一个序列,支持区间加,区间反转,区间max询问 裸的平衡树题,这里采用FHQ-Treap 每个节点多记录一个max值和两个lazy_tag,暴力Push_Down即可(大常数选手) 打完这 ...

  8. bzoj 1251: 序列终结者 平衡树,fhqtreap

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...

  9. Poj3580 Super Memo(FHQ-Treap)

    题面 题解 对于操作$1$,我们可以对于每个节点打一个$add$标记,下放就行了 对于操作2,可以参考这篇题解的上一篇,不赘述 对于操作4,可以将区间裂成两部分,然后再插入合并 对于操作5,可以将区间 ...

随机推荐

  1. 【jQuery】 资料

    [jQuery] 资料 1. 选择器 http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 2. 事件 http://www.w3sch ...

  2. Android应用AsyncTask处理机制详解及源码分析

    1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handler异步机制原理(不了解的可以阅读我的<Android异步消息处理机 ...

  3. mybatis <collection>标签 类型为string时无法获取重复数据错误

    1.场景: fyq_share_house 表 和 fyq_sh_tag 表 两张表是一对多的关系, 一个楼盘对应多个标签,在实体类ShareHouse中使用 /** * 楼盘标签 */ privat ...

  4. selenium自动化登录qq网页

    一个简单的登录网页上qq的脚本,通过此脚本了解到有些位置是无法通过xpath来定位的反倒是By定位更方便 #encoding=utf-8 from selenium import webdriver ...

  5. python学习总结------邮件与短信

    邮件发送 - 简介: - 邮件服务器.用户名.密码 - 相关协议: - SMTP:简单邮件传输协议 - POP3:邮局通讯协议 - IMAP:交互式邮件存取协议 - SMTP协议默认端口是25 - 用 ...

  6. 权值树状数组 HDU-2852 KiKi's K-Number

    引入 权值树状数组就是数组下标是数值的数组,数组存储下标对应的值有几个数 题目 HDU-2852 KiKi's K-Number 题意 几种操作,p=0代表push:将数值为a的数压入盒子 p=1代表 ...

  7. %matplotlib inline

    整理摘自 https://zhidao.baidu.com/question/1387744870700677180.html %matplotlib inline是jupyter notebook里 ...

  8. Ubuntu 进阶命令——长期不定时更新

    有时候远程连接服务器忽然中断或者不小心关掉了终端界面,正在运行的命令或者程序就会被强制停止.这时候,我们可以借助一些命令来避免这种情况的发生. nohup 不挂断地运行命令 & 在后台运行命令 ...

  9. hadoop 环境配置

    HADOOP_HOME E:\tool\eclipse\hadoop-2.7.3 HADOOP_USER_NAME ambari-qa path: %HADOOP_HOME%/bin

  10. Vue折腾记 - (3)写一个不大靠谱的typeahead组件

    Vue折腾记 - (3)写一个不大靠谱的typeahead组件 2017年07月20日 15:17:05 阅读数:691 前言 typeahead在网站中的应用很多..今天跟着我来写一个不大靠谱的ty ...