Description
给出一个初始序列A1,A2,...,An,要求你编写程序支持如下操作:

  1. ADD x y D:给子序列Ax...Ay的每个元素都加上D。例如对1,2, 3,4,5执行"ADD 2 4 1" 会得到1,3,4,5,5。
  2. REVERSE x y:将子序列Ax...Ay翻转。例如对1,2,3,4,5执行"REVERSE 2 4"会得到1,4,3,2,5。
  3. REVOLVE x y T:将子序列Ax...Ay旋转T个单位。例如,对1,2,3,4,5执行"REVOLVE 2 4 2"会得到1,3,4,2,5。
  4. INSERT x P:在Ax后插入P。例如,对1,2,3,4,5执行"INSERT 2 4"会得到1,2,4,3,4,5。
  5. DELETE x:删去Ax。例如,对1,2,3,4,5执行"DELETE 2"会得到1,3,4,5。
  6. MIN x y:查询子序列Ax...Ay中的最小元素。例如,对于序列1, 2,3,4,5,询问"MIN 2 4"的返回应为2。

Input
第一行包含一个整数n,表示初始序列的长度。
以下n行每行包含一个整数,描述初始的序列。
接下来一行包含一个整数m,表示操作的数目。以下m行每行描述一个操作。n,m<=10^6

Output
对于所有"MIN"操作,输出正确的答案,每行一个。

Sample Input
5
1
2
3
4
5
2
ADD 2 4 1
MIN 4 5

Sample Output
5


跟[NOI2005]维修数列差不多,插入删除什么的都不用建树了,查找只要找MIN,除了REVOLVE麻烦点之外,其余并不难

找前驱后继的时候要记得pushdown,被坑了。。。

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x3fffffff
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){int x=0,f=1;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar())  if (ch=='-')    f=-1;for (;ch>='0'&&ch<='9';ch=getchar())    x=(x<<1)+(x<<3)+ch-'0';return x*f;
}
inline void print(int x){if (x>=10)     print(x/10);putchar(x%10+'0');
}
const int N=1e6;
int stack[N+10],top,v[N+10];
struct Splay{#define T(x) (tree[f[x]][1]==x)#define ls(x) tree[x][0]#define rs(x) tree[x][1]int tree[N+10][2],f[N+10],size[N+10],val[N+10],Min[N+10],cnt[N+10];bool rev[N+10];int root,len;void rev_tag(int x){if (!x) return;swap(ls(x),rs(x));rev[x]^=1;}void cnt_tag(int x,int v){if (!x) return;cnt[x]+=v,val[x]+=v,Min[x]+=v;}void pushdown(int x){if (cnt[x]){cnt_tag(ls(x),cnt[x]);cnt_tag(rs(x),cnt[x]);cnt[x]=0;}if (rev[x]){rev_tag(ls(x));rev_tag(rs(x));rev[x]=0;}}void updata(int x){size[x]=size[ls(x)]+size[rs(x)]+1;Min[x]=val[x];if (ls(x))  Min[x]=min(Min[x],Min[ls(x)]);if (rs(x))  Min[x]=min(Min[x],Min[rs(x)]);}int get(){int x;x=top?stack[top--]:++len;val[x]=Min[x]=inf;ls(x)=rs(x)=f[x]=0;size[x]=1;cnt[x]=rev[x]=0;return x;}void build(int fa,int l,int r,int &x){if (l>r)    return;int mid=(l+r)>>1;x=get(),f[x]=fa,val[x]=Min[x]=v[mid];build(x,l,mid-1,ls(x)),build(x,mid+1,r,rs(x));updata(x);}void init(int n){val[0]=Min[0]=inf;root=1,len=2;rs(1)=size[1]=2,Min[1]=val[1]=inf;f[2] =size[2]=1,Min[2]=val[2]=inf;for (int i=1;i<=n;i++)  v[i]=read();build(2,1,n,ls(2));updata(2),updata(1);}void move(int x){pushdown(x);int fa=f[x],son=tree[x][T(x)^1];tree[x][T(x)^1]=fa;tree[fa][T(x)]=son;if (son)    f[son]=fa;f[x]=f[fa];if (f[x])   tree[f[x]][T(fa)]=x;f[fa]=x;updata(fa),updata(x);}void splay(int x){while (f[x]){if (f[f[x]])    T(x)==T(f[x])?move(f[x]):move(x);move(x);}root=x;}int find(int x,int i){pushdown(i);if (size[ls(i)]+1==x)   return i;if (x<=size[ls(i)]) return find(x,ls(i));return find(x-size[ls(i)]-1,rs(i));}int get_suc(){int x=rs(root);pushdown(x);while (ls(x))   pushdown(x),x=ls(x);return x;}void insert(){int x=read(),v=read(),t=get();x=find(x+1,root),splay(x);splay(get_suc());f[rs(x)=t]=x;val[t]=Min[t]=v;updata(x),updata(root);}void ADD(){int x=read(),y=read(),v=read();x=find(x,root),splay(x);y=find(y+2,root),splay(y);if (f[x]!=root) move(x);cnt_tag(rs(x),v);updata(x),updata(y);}void filp(){int x=read(),y=read();x=find(x,root),splay(x);y=find(y+2,root),splay(y);if (f[x]!=root) move(x);rev_tag(rs(x));}void Delete(){int x=read(),y=x;x=find(x,root),splay(x);y=find(y+2,root),splay(y);if (f[x]!=root) move(x);stack[++top]=rs(x);f[rs(x)]=0,rs(x)=0;updata(x),updata(y);}void revolve(){int l=read(),y=read(),len=y-l+1,t=read()%len,x=y-t+1;if (!t) return;x=find(x,root),splay(x);y=find(y+2,root),splay(y);if (f[x]!=root) move(x);int son=rs(x);f[rs(x)]=0,rs(x)=0;updata(x),updata(y);l=find(l,root),splay(l);splay(get_suc());rs(l)=son,f[son]=l;updata(l),updata(root);}void query(){int x=read(),y=read();x=find(x,root),splay(x);y=find(y+2,root),splay(y);if (f[x]!=root) move(x);printf("%d\n",Min[rs(x)]);}
}T;
char s[10];
int main(){int n=read();T.init(n);int m=read();for (int i=1;i<=m;i++){memset(s,0,sizeof(s));scanf("%s",s);if (s[0]=='A')  T.ADD();if (s[0]=='M')  T.query();if (s[0]=='I')  T.insert();if (s[0]=='D')  T.Delete();if (s[5]=='S')  T.filp();if (s[5]=='V')  T.revolve();}return 0;
}

转载于:https://www.cnblogs.com/Wolfycz/p/9481168.html

[POJ3580]SuperMemo相关推荐

  1. 三大平衡树(Treap + Splay + SBT)总结+模板

    Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...

  2. Splay Tree

    类别:二叉排序树 空间效率:O(n) 时间效率:O(log n)内完成插入.查找.删除操作 创造者:Daniel Sleator和Robert Tarjan 优点:每次查询会调整树的结构,使被查询频率 ...

  3. 平衡二叉树 treap

    treap通过左右旋维护了一个二叉查找树,根据随机的优先级建立满足优先级大根堆的二叉查找树,在实践中有不错的食府,code也简单. cogs1829 普通平衡树 题目大意:进行插入.删除.名次.前驱后 ...

  4. 平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】...

    平衡树初阶--AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是 ...

  5. Supermemo背单词7周年纪念

    从2007年2月1日开始,用Supermemo背单词7周年了,在2013年11月21日将单词表Reset,重新开始Review以前背过的单词,并慢慢加入听写VOA时遇到的生词.

  6. 用Supermemo背单词达到8000词条

    近1个月的密集英语学习,加入到supermemo中的词条数迅速增多,达到8000个. 转载于:https://www.cnblogs.com/speeding/archive/2013/05/13/3 ...

  7. 软件构想:supermemo 云计算方案

    构建一种学习系统,用户可以随时通过终端登录,获取学习内容与以往学习记录,以便进行学习和复习. 具体点就是将SuperMemo配合一个服务器,将supermemo collection放在服务器上,终端 ...

  8. POJ 3580 SuperMemo(伸展树的基本操作)

    题目大意:给你六个操作,让你实现这些功能. 解题思路:伸展树的基本应用,用伸展数实现各种功能. SuperMemo Time Limit: 5000MS   Memory Limit: 65536K ...

  9. 初中英语八下单词表(SuperMemo QA文本格式)

    用emeditor的正则表达式替换,可以把QA的内容互换, 查找 Q: (.*\n)A: (.*\n) 替换 Q: \2A: \1 转换完成的TXT在这里下载. Q: robot A: n.机器人 Q ...

  10. POJ 3580 SuperMemo

    http://poj.org/problem?id=3580 题目大意说给你一个数列,有区间同加一个数.区间翻转操作.区间滚动操作.删除一个数.插入一个数,查询区间最小值这些操作. 我是使用Splay ...

最新文章

  1. hdu 2594 kmp
  2. 【黑客免杀攻防】读书笔记4 - 壳在免杀中的应用
  3. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
  4. uva 1631——Locker
  5. win7 apache+php+mysql_win7下手动配置apache+php+mysql记
  6. Part01、sqlalchemy 使用
  7. python mockito arg_that_编程高阶用法–开发者高频词汇
  8. MySql绿色版安装和配置
  9. IP抓包精准定位教程
  10. 债券估值-零息债券、附息债券和永久债券
  11. 博主自传——蒟蒻的OI之路
  12. 超窄带通信系统UNB原理以及简单模拟
  13. Excel 2010 SQL应用048 比较两列数据是否相同
  14. Lookup Table 应用
  15. Android毕设项目功能:商城列表与购物车展示(一)
  16. 央行征信爬虫解决方案
  17. gom及gee小白架设黑屏的原因以及个别装备地图不显示怎么办?
  18. Win10 1709 无法访问局域网共享问题及解决
  19. Java 7从入门到精通 前 言
  20. 当ChatGPT遇上StableDiffusion ChatGPT指导StableDiffusion绘画

热门文章

  1. Active Directory Get User's groups using LDAP
  2. Elasticsearch实践(四):IK分词
  3. Android冷启动优化解析
  4. 八、JVM视角浅理解并发和锁
  5. testlink配置修改
  6. Office版本差别引发的语法问题
  7. 将原生安卓项目封装为cordova插件实例分析
  8. 【万里征程——Windows App开发】使用华丽丽的字体
  9. CSS浮动元素的水平居中
  10. .net知识和学习方法系列(二十一)CLR-枚举