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的更多相关文章
随机推荐
- 超精简易用cocoaPods的安装和使用
cocoaPods 安装和使用 第一步:替换ruby源 $ gem sources -l 查看当前ruby的源 $ gem sources ...
- getElementById 用法的一个技巧
假设实现把 TextBox1 的字符实时的拷贝到 TextBox2 中,代码如下: <Script language="Javascript"> fun ...
- 怎么分别javascript写在<head>里还是<body>里面?
怎么分别javascript写在<head>里还是<body>里面? 具体哪些语句写在<body>里,哪些语句写在<head>里 满意答案 BeginN ...
- Spring3 MVC使用@ResponseBody的乱码问题及解决办法
近日用Spring3的MVC写东西,深感其之于Webwork/Struts2的便利,但是在通过@ResponseBody这个annotation输出一个json字符串的时候,发现页面上获得的json字 ...
- JS基础:闭包和作用域链
简介 一个定义在函数内部的函数与包含它的外部函数构成了闭包,内部函数可以访问外部函数的变量,这些变量将一直保存在内存中,直到无法再引用这个内部函数. 例如: var a = 0; function o ...
- Nginx SSL功能支持的一些资料。
http://wiki.nginx.org/HttpSslModulehttp://zou.lu/nginx-https-ssl-module/http://www.21andy.com/blog/2 ...
- HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么
Hashmap在并发环境下,可能出现的问题: 1.多线程put时可能会导致get无限循环,具体表现为CPU使用率100%: 原因:在向HashMap put元素时,会检查HashMap的容量是否足够, ...
- Redis案例——商品秒杀,购物车
秒杀案例: <?php header("content-type:text/html;charset=utf-8"); $redis = new redis(); $resu ...
- LeetCode_图像渲染
题目: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 ne ...
- 树莓派创建WiFi热点
将代码clone到本地 git clone https://github.com/oblique/create_ap cd create_ap make install 安装依赖的库 有些源中可能使用 ...