bzoj1895
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的更多相关文章
- 【BZOJ1895】Pku3580 supermemo Splay
[BZOJ1895]Pku3580 supermemo Description 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg ...
- [bzoj1895][Pku3580]supermemo_非旋转Treap
supermemo bzoj-1895 Pku-3580 题目大意:给定一个n个数的序列,需支持:区间加,区间翻转,区间平移,单点插入,单点删除,查询区间最小值. 注释:$1\le n\le 6.1\ ...
- BZOJ1895: Pku3580 supermemo
1895: Pku3580 supermemo Time Limit: 15 Sec Memory Limit: 64 MBSubmit: 77 Solved: 47[Submit][Status ...
- 非旋treap (BZOJ1895)
记个板子,还是挺好用的. #include <bits/stdc++.h> using namespace std; ]; int rt,n,m,l,r,x,A,B,C,t; struct ...
随机推荐
- JS——大小写转化
<script> var str = 'JavaScript'; console.log(str.toUpperCase());//小写转大写 console.log(str.toLowe ...
- 【译】x86程序员手册08 -2.6中断和异常
2.6 Interrupts and Exceptions 中断和异常 The 80386 has two mechanisms for interrupting program execution: ...
- Html test
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- Josephus problem(约瑟夫问题,丢手绢问题)
约瑟夫问题 约瑟夫环问题是一个数学应用题:已知n个人(以编号1,2,3.....,n)围坐在一张圆桌的周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列 ...
- eas之列表界面写脚本时如何写sql
var easNames = JavaImporter();easNames.importPackage(Packages.com.kingdee.bos.dao.query);with(easNam ...
- 【LeetCode】3 、Longest Substring Without Repeating Characters
题目等级:Medium 题目描述: Given a string, find the length of the longest substring without repeating chara ...
- BZOJ 1230 Usaco2008 Nov 开关灯
[题意概述] 给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数 [题解] 线段树. 每次区间修改把区间 ...
- Tkinter图形界面设计(GUI)
[因为这是我第一个接触的GUI图形界面python库,现在也不用了,所以大多数内容都来自之前花 钱买的一些快速入门的内容,可以当作简单的知识点查询使用] 在此声明:内容来自微信公众号GitChat,付 ...
- 敏捷开发系列学习总结(2)——Bug修改流程
原则,力求各司其职,简单明了. 1. 测试人员提交bug ⑴ 标题: [ 模块名称 ] 问题描述 ⑵ 内容: 问题重现步骤的描述,最好贴上图片. 因为一图胜万言. ⑶ 指定责任人: 根据bug指定责任 ...
- JavaSE 学习笔记之StringBuffer(十五)
--< java.lang >-- StringBuffer字符串缓冲区: 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一 ...