BZOJ_1895_Pku3580 supermemo_Splay
BZOJ_1895_Pku3580 supermemo_Splay
Description
Input
Output
Sample Input
1
2
3
4
5
2
ADD 2 4 1
MIN 4 5
Sample Output
HINT
输入、输出以及中间运算结果均不会超过32位整数。
对于30%的数据,n;m 6 1000;
对于100%的数据,n;m 6 100000。
splay裸题,操作稍微多了点。
旋转操作可以理解为进行三次区间翻转操作,这样就十分方便了。
注意旋转单位要mod区间长度。
具体实现在代码中:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- #define N 1200050
- #define ls ch[p][0]
- #define rs ch[p][1]
- #define get(x) (ch[f[x]][1]==x)
- int ch[N][2],f[N],siz[N],turn[N],val[N],mn[N],rt;
- int a[N],n,add[N],sz,m,now;
- char opt[10];
- void pushup(int p){
- if(!p)return ;
- siz[p]=1;
- if(ls) siz[p]+=siz[ls];
- if(rs) siz[p]+=siz[rs];
- mn[p]=min(mn[ls],mn[rs]);
- mn[p]=min(mn[p],val[p]);
- }
- void pushdown(int p)
- {
- if(add[p]){
- if(ls) mn[ls]+=add[p],val[ls]+=add[p],add[ls]+=add[p];
- if(rs) mn[rs]+=add[p],val[rs]+=add[p],add[rs]+=add[p];
- add[p]=0;
- }
- if(turn[p]){
- swap(ls,rs);
- if(ls) turn[ls]^=1;
- if(rs) turn[rs]^=1;
- turn[p]=0;
- }
- }
- void rotate(int x)
- {
- int y=f[x],z=f[y],k=get(x);
- ch[y][k]=ch[x][!k];f[ch[y][k]]=y;
- ch[x][!k]=y;f[y]=x;f[x]=z;
- if(z) ch[z][ch[z][1]==y]=x;
- pushup(y);pushup(x);
- if(rt==y) rt=x;
- }
- void splay(int x,int y)
- {
- for(int fa;(fa=f[x])!=y;rotate(x))
- if(f[fa]!=y)
- rotate((get(x)==get(fa)) ? fa : x);
- }
- int find(int x)
- {
- int p=rt;
- while(1)
- {
- pushdown(p);
- if(x<=siz[ls]) p=ls;
- else{
- x-=siz[ls]+1;
- if(!x) return p;
- p=rs;
- }
- }
- }
- void addadd(int x,int p,int v)
- {
- x=find(x);
- p=find(p);
- splay(x,0);
- splay(p,rt);
- add[ls]+=v;
- mn[ls]+=v;
- val[ls]+=v;
- pushup(p);pushup(x);
- }
- void reverse(int x,int p)
- {
- x=find(x);
- p=find(p);
- splay(x,0);
- splay(p,rt);
- turn[ls]^=1;
- }
- void build(int fa,int l,int r)
- {
- if(l>r) return ;
- int mid=l+r>>1;
- ch[fa][mid>fa]=mid;
- f[mid]=fa;
- val[mid]=mn[mid]=a[mid-1];
- build(mid,l,mid-1);
- build(mid,mid+1,r);
- pushup(mid);
- }
- void insert(int x,int v)
- {
- now++;
- int p=x+1;
- x=find(x);
- p=find(p);
- splay(x,0);
- splay(p,rt);
- ls=++sz;
- val[ls]=mn[ls]=v;
- f[ls]=p;
- siz[ls]=1;
- pushup(p);pushup(x);
- }
- void del(int x)
- {
- now--;
- int p=x+2;
- x=find(x);
- p=find(p);
- splay(x,0);
- splay(p,rt);
- ls=0;
- pushup(p);pushup(x);
- }
- int ask(int x,int p)
- {
- x=find(x);
- p=find(p);
- splay(x,0);
- splay(p,rt);
- return mn[ls];
- }
- /*void print()
- {
- int p,i;
- for(i=1;i<=now;i++){
- p=find(i);
- printf("p=%d val[p]=%d\n",p,val[p]);
- }
- }*/
- int main(){
- //memset(mn,0x3f,sizeof(mn));
- mn[0]=1<<30;
- scanf("%d",&n);
- int i,x,y,z;
- for(i=1;i<=n;i++) scanf("%d",&a[i]);
- build(0,1,n+2);
- sz=now=n+2;
- rt=n+3>>1;
- scanf("%d",&m);
- for(i=1;i<=m;i++)
- {
- scanf("%s%d",opt,&x);
- if(opt[0]=='A')
- {
- scanf("%d%d",&y,&z);
- x++;y++;
- addadd(x-1,y+1,z);
- }
- else if(opt[0]=='R')
- {
- scanf("%d",&y);
- x++;y++;
- if(opt[3]=='E')
- {
- reverse(x-1,y+1);
- }
- else
- {
- scanf("%d",&z);
- z%=(y-x+1);
- if(z==0)continue;
- reverse(x-1,y+1);
- reverse(x-1,x+z);
- reverse(x+z-1,y+1);
- }
- }
- else if(opt[0]=='I')
- {
- scanf("%d",&y);
- x++;
- insert(x,y);
- }
- else if(opt[0]=='D')
- {
- x++;
- del(x-1);
- }
- else {
- scanf("%d",&y);
- x++;y++;
- printf("%d\n",ask(x-1,y+1));
- }
- }
- }
BZOJ_1895_Pku3580 supermemo_Splay的更多相关文章
随机推荐
- GitHub Desktop 如何创建本地仓库,上传代码,删除仓库
1.创建本地仓库 2.打开本地仓库,将要上传的文件放到本地仓库. 3.ctrl+p push仓库或者菜单栏Repository下push也可以用右上角的publish respository 4.左边 ...
- rsync+innotify做到同步式更新
innotify主要功能: 他是内核用于通知用户控件程序文件系统变化的机制. 也就是说,当服务器发生了任何的改动,内核都会知道并通知用户. rssync(做同步的)+innotify做到的就是实时的同 ...
- Pyharm中关于“warning: Debugger speedups using cython not found”问题的解决
在终端中输入 Python "/Applications/PyCharm CE.app/Contents/helpers/pydev/setup_cython.py" build_ ...
- Drupal7.8的安装注意的问题
首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...
- Bootstrap 4,“未捕获错误:Bootstrap工具提示需要Tether(http://github.hubspot.com/tether/)”
如果出现了这个错误,我想你是没有引用tether文件,这在v4之前不需要单独引入的. https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/te ...
- eBay账号token授权
1.注册开发者账号(https://go.developer.ebay.com/) hufangyong hu6253859. 2.注册沙箱测试账号(http://sandbox.ebay.com ...
- Java虚拟机-内存tips
java虚拟机内存可以分为独占区和共享区. 独占区:虚拟内存栈.本地方法栈.程序计数器. 共享区:方法区.Java堆(用来存放对象实例). 程序计数器 比较小的内存空间,当前线程所执行的字节码的行号指 ...
- JS中的top是什么?
<iframe/>或者<frame>里面用主页面的东西,就是top.xxx如:<script> function func(){ ... };</script ...
- Bootstrap在线引用css和js
百度在线调用 <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></ ...
- flash builder 4.6与myecilpse 10.7集成
一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...