题面

题解

对于操作$1$,我们可以对于每个节点打一个$add$标记,下放就行了

对于操作2,可以参考这篇题解的上一篇,不赘述

对于操作4,可以将区间裂成两部分,然后再插入合并

对于操作5,可以将区间裂成三部分,删除其中一个部分,合并其他两部分

对于操作6,打一个$min$标记,具体可以看代码。


对于操作3,这个有点复杂,但是手玩可以发现,修改完后只是某两个断开的区间换了位置,只是断点不确定,算一下即可(细节有点多。)


#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
} const int N = 2e5 + 10;
int n, m, lc[N], rc[N], siz[N], val[N], pri[N], rev[N], add[N], mn[N], tot; inline void rotate(int o) { std::swap(lc[o], rc[o]), rev[o] ^= 1; }
inline void __add(int o, int v) { val[o] += v, mn[o] += v, add[o] += v; }
inline void upt(int o) {
siz[o] = siz[lc[o]] + siz[rc[o]] + 1, mn[o] = val[o];
if(lc[o]) mn[o] = std::min(mn[o], mn[lc[o]]);
if(rc[o]) mn[o] = std::min(mn[o], mn[rc[o]]);
}
inline int node(int x) {
val[++tot] = x, pri[tot] = rand(), siz[tot] = 1, mn[tot] = x;
return tot;
}
void pushdown(int o) {
if(add[o]) {
if(lc[o]) __add(lc[o], add[o]);
if(rc[o]) __add(rc[o], add[o]);
add[o] = 0;
}
if(rev[o]) {
if(lc[o]) rotate(lc[o]);
if(rc[o]) rotate(rc[o]);
rev[o] = 0;
}
}
void split(int o, int k, int &l, int &r) {
if(!o) { l = r = 0; return ; } pushdown(o);
if(siz[lc[o]] < k) l = o, split(rc[o], k - siz[lc[o]] - 1, rc[o], r);
else r = o, split(lc[o], k, l, lc[o]);
upt(o);
}
int merge(int l, int r) {
if(!l || !r) return l + r;
pushdown(l), pushdown(r);
if(pri[l] < pri[r]) { rc[l] = merge(rc[l], r), upt(l); return l; }
else { lc[r] = merge(l, lc[r]), upt(r); return r; }
} int main () {
read(n), srand(19260817);
int x, y, l, r, k, rt = 0, D, T;
for(int i = 1; i <= n; ++i)
read(x), rt = merge(rt, node(x));
read(m); char opt[10];
for(int i = 1; i <= m; ++i) {
scanf("%s", opt), read(x);
if(opt[0] == 'A') {
read(y), read(D);
split(rt, y, l, r), split(l, x - 1, l, k);
__add(k, D), rt = merge(merge(l, k), r);
}
if(opt[0] == 'R' && opt[3] == 'E') {
read(y), split(rt, y, l, r), split(l, x - 1, l, k);
rotate(k), rt = merge(merge(l, k), r);
}
if(opt[0] == 'R' && opt[3] == 'O') {
read(y), read(T);
T %= (y - x + 1);
if(!T) continue;
T = (y - x + 1) - T;
split(rt, y, l, r), split(l, x - 1, l, k);
split(k, T, k, D);
rt = merge(merge(l, merge(D, k)), r);
}
if(opt[0] == 'I') read(y), split(rt, x, l, r), rt = merge(merge(l, node(y)), r);
if(opt[0] == 'D') split(rt, x, l, r), split(l, x - 1, l, k), rt = merge(l, r);
if(opt[0] == 'M') {
read(y), split(rt, y, l, r), split(l, x - 1, l, k);
printf("%d\n",mn[k]), rt = merge(merge(l, k), r);
}
}
return 0;
}

Poj3580 Super Memo(FHQ-Treap)的更多相关文章

  1. 可持久化treap(FHQ treap)

    FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值 ...

  2. BZOJ3159: 决战(FHQ Treap)

    传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...

  3. POJ3622 Gourmet Grazers(FHQ Treap)

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2363   Accepted: 881 Description Like s ...

  4. LOJ#105. 文艺平衡树(FHQ Treap)

    题面 传送门 题解 \(FHQ\ Treap\)比起\(Splay\)还是稍微好写一点--就是老是忘了要下穿标记-- //minamoto #include<bits/stdc++.h> ...

  5. 洛谷P3369 【模板】普通平衡树(FHQ Treap)

    题面 传送门 题解 写了一下\(FHQ\ Treap\) //minamoto #include<bits/stdc++.h> #define R register #define inl ...

  6. 洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  7. bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...

  8. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

  9. LOJ#120. 持久化序列(FHQ Treap)

    题面 传送门 题解 可持久化\(Treap\)搞一搞 //minamoto #include<bits/stdc++.h> #define R register #define inlin ...

随机推荐

  1. 深入HBase架构解析(一)

    前记 公司内部使用的是MapR版本的Hadoop生态系统,因而从MapR的官网看到了这篇文文章:An In-Depth Look at the HBase Architecture,原本想翻译全文,然 ...

  2. Linux和windows下检查jsp后门文件的方法

    Linux下: find . -name "*.jsp" | xargs egrep -liw "createNewFile| File\(| File |applica ...

  3. 【Nginx】不改系统源代码的情况下,动态网站离线缓存方案

    背景: 公司的一套系统,由前端.界面.服务层.大数据开发平架等多层组成,每一层被划分为多个模块,每个模块会依赖若干组建.由于公司的这套系统是部署在内网环境中的,现在需要拿出去给客户演示,用一个笔记本装 ...

  4. bzoj 3126: [Usaco2013 Open]Photo——单调队列优化dp

    Description 给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点 Input * Line 1: Two integers N and M. * Lines 2..M+ ...

  5. 【bzoj】1717 [Usaco2006 Dec]Milk Patterns 产奶的模式

    [算法]后缀数组 [题解]后缀数组 由于m太大,先离散化. 然后处理SA和LCP. 最后用单调队列处理即可. 注意实际上队列头尾长度限制是K-1. 删队尾不要删过头 i≥K才能开始统计答案. #inc ...

  6. POj 2104 K-th Number (分桶法+线段树)

    题目链接 Description You are working for Macrohard company in data structures department. After failing ...

  7. Winform GDI+

    什么是GDI+ GDI (Graphics Device Interface), 是属于绘图方面的 API (Application Programming Interface). 因为应用程序不能直 ...

  8. Windows Server 2008 R2英文版修改桌面主题(Win7主题)

    1:首先打开Server Manager(凡是不知道在那里开发均可像Win7一样在运行里面搜索) 2:然后在左边的树形菜单中选择:Feature 点击右边页面中的:Add Features 这时候会出 ...

  9. bzoj 1188 SG函数

    首先我们可以把一个石子看成一个单独的游戏,那么我们可以发现所有位置的石子至于奇偶有关,因为某一个人操作其中的一个石子,我们可以用相同的石子做相同的操作,所以我们只需要保留下所有位置的01,那么对于每个 ...

  10. Python面向对象学习2(面向对象的语法和特性,待更新)

    上一个内容我们介绍了面向对象和面向对象场景现在我们来学习下语法和特性 1,面向对象基本语法: # -*- coding:utf-8 -*- # Author: Colin Yao class Dog( ...