fhqtreap

其实fhqtreap只有可持久化之后才用新建节点。。。

reverse和splay一样。

//#include<bits/stdc++.h>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = ;
int n, root, cnt, m, last;
int size[N], tag[N], a[], rnd[N];
int child[N][];
ll mn[N], add[N], key[N];
void update(int x)
{
size[x] = size[child[x][]] + size[child[x][]] + ;
mn[x] = min(key[x], min(mn[child[x][]], mn[child[x][]]));
}
void pushdown(int x)
{
if(!x) return;
if(add[x])
{
add[child[x][]] += add[x];
add[child[x][]] += add[x];
mn[child[x][]] += add[x];
mn[child[x][]] += add[x];
key[child[x][]] += add[x];
key[child[x][]] += add[x];
add[x] = ;
}
if(tag[x])
{
tag[child[x][]] ^= ;
tag[child[x][]] ^= ;
swap(child[x][], child[x][]);
tag[x] = ;
}
}
int newnode(int x)
{
++cnt;
size[cnt] = ;
rnd[cnt] = rand();
key[cnt] = x;
mn[cnt] = x;
return cnt;
}
int copy(int x)
{
++cnt;
size[cnt] = size[x];
rnd[cnt] = rnd[x];
tag[cnt] = tag[x];
mn[cnt] = mn[x];
add[cnt] = add[x];
child[cnt][] = child[x][];
child[cnt][] = child[x][];
key[cnt] = key[x];
return cnt;
}
int merge(int x, int y)
{
if(!x) return y;
if(!y) return x;
pushdown(x);
pushdown(y);
if(rnd[x] < rnd[y])
{
child[x][] = merge(child[x][], y);
update(x);
return x;
}
else
{
child[y][] = merge(x, child[y][]);
update(y);
return y;
}
}
PII split(int x, int k)
{
if(!x) return make_pair(, );
PII ret;
pushdown(x);
if(k <= size[child[x][]])
{
ret = split(child[x][], k);
child[x][] = ret.second;
ret.second = x;
update(x);
return ret;
}
else
{
ret = split(child[x][], k - size[child[x][]] - );
child[x][] = ret.first;
ret.first = x;
update(x);
return ret;
}
}
void Add(int l, int r, int d)
{
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
key[t2.first] += d;
add[t2.first] += d;
mn[t2.first] += d;
root = merge(t1.first, merge(t2.first, t2.second));
}
void reverse(int l, int r)
{
int mid = r - l + ;
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
tag[t2.first] ^= ;
root = merge(t1.first, merge(t2.first, t2.second));
}
void revolve(int l, int r, int t)
{
if(t < ) t = ;
t %= (r - l + );
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
PII t3 = split(t2.first, r - l + - t);
root = merge(t1.first, merge(merge(t3.second, t3.first), t2.second));
}
void ins(int x, int p)
{
PII t1 = split(root, x);
int a = newnode(p);
root = merge(t1.first, merge(a, t1.second));
}
void del(int x)
{
PII t1 = split(root, x - );
PII t2 = split(t1.second, );
root = merge(t1.first, t2.second);
}
void que(int l, int r)
{
PII t1 = split(root, l - );
PII t2 = split(t1.second, r - l + );
printf("%lld\n", mn[t2.first]);
root = merge(t1.first, merge(t2.first, t2.second));
}
void build(int &x, int l, int r)
{
if(l > r) return;
int mid = (l + r) >> ;
x = newnode(a[mid]);
build(child[x][], l, mid - );
build(child[x][], mid + , r);
update(x);
}
void print(int x)
{
if(!x) return;
pushdown(x);
print(child[x][]);
printf("%d ", key[x]);
print(child[x][]);
}
int main()
{
// freopen("supermemo8.in", "r", stdin);
// freopen("output.txt", "w", stdout);
srand();
scanf("%d", &n);
for(int i = ; i <= n; ++i)
scanf("%d", &a[i]);
mn[] = 10000000000000ll;
build(root, , n);
scanf("%d", &m);
while(m--)
{
char opt[]; int l, r, d, x, t, p; scanf("%s", opt);
if(opt[] == 'A')
{
scanf("%d%d%d", &l, &r, &d);
Add(l, r, d);
}
if(opt[] == 'V' && opt[] == 'E')
{
scanf("%d%d", &l, &r);
reverse(l, r);
}
if(opt[] == 'O')
{
scanf("%d%d%d", &l, &r, &t);
revolve(l, r, t);
}
if(opt[] == 'I')
{
scanf("%d%d", &x, &p);
ins(x, p);
}
if(opt[] == 'D')
{
scanf("%d", &x);
del(x);
}
if(opt[] == 'M')
{
scanf("%d%d", &l, &r);
que(l, r);
}
// print(root);
// puts("");
}
// fclose(stdin); fclose(stdout);
return ;
}

bzoj1895的更多相关文章

  1. 【BZOJ1895】Pku3580 supermemo Splay

    [BZOJ1895]Pku3580 supermemo Description 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg ...

  2. [bzoj1895][Pku3580]supermemo_非旋转Treap

    supermemo bzoj-1895 Pku-3580 题目大意:给定一个n个数的序列,需支持:区间加,区间翻转,区间平移,单点插入,单点删除,查询区间最小值. 注释:$1\le n\le 6.1\ ...

  3. BZOJ1895: Pku3580 supermemo

    1895: Pku3580 supermemo Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 77  Solved: 47[Submit][Status ...

  4. 非旋treap (BZOJ1895)

    记个板子,还是挺好用的. #include <bits/stdc++.h> using namespace std; ]; int rt,n,m,l,r,x,A,B,C,t; struct ...

随机推荐

  1. jQuery——类的添加与删除

    添加类:addClass 删除类:removeClass 判断类是否存在:hasClass <!DOCTYPE html> <html lang="en"> ...

  2. [Windows Server 2012] 安装Apache+PHP+MySQL

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:Win2012 ...

  3. 正文处理命令及tar命令

    使用cat命令进行文件的纵向合并,具体命令如下所示(注意:>代表将左边命令的执行结果以覆盖的方式放到右边,>>代表将左边命令的执行结果追加到右边) 关于tar命令的一些用法: tar ...

  4. 郁闷的出纳员 题解(Splay)

    题面 看似是要区间修改,然而实际上只需要维护底线和工资的相对大小关系, 瞬间变水 用delta记录对工资的加减,那么添加节点时点权应-delta,输出时+delta 几种操作中减少工资较麻烦: 1.d ...

  5. centOS7创建python虚拟环境

    参考: 非常棒的2篇博客 https://www.centos.bz/2018/05/centos-7-4-%E5%AE%89%E8%A3%85python3%E5%8F%8A%E8%99%9A%E6 ...

  6. HDU 3152 Obstacle Course(优先队列,广搜)

    题目 用优先队列优化普通的广搜就可以过了. #include<stdio.h> #include<string.h> #include<algorithm> usi ...

  7. models中字段参数blank和null的用法区别

    blank当blank=True时,说明此处的数据可以不填,默认情况下为False,也就意味着默认情况下,所输入的数据不得空,blank是和页面表单有关,在页面需要输入参数的时候,如果在models里 ...

  8. Django——9 博客小案例的实现

    Django  博客小案例的实现 主要实现博客的增删改查功能 主页index.html  -->  展示添加博客和博客列表的文字,实现页面跳转 添加页add.html  --> 输入文章标 ...

  9. 基于CNONIX国家标准的出版社ERP系统建设分享

    目录 一.出版社ERP系统建设面临的三大挑战 在系统建设中如何贯彻CNONIX国家标准 新ERP系统建设面临的挑战 技术体系及架构选择面临的挑战 二.系统建设实施过程控制 项目组织管控 项目技术管控 ...

  10. [bzoj1007][HNOI2008]水平可见直线_单调栈

    水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...