http://poj.org/problem?id=3580

伸展树的各种操作 收口袋大法好 一开始看模板上额外在维护数列的二叉树上又加了两个节点 root和root->ch[1] 觉得很蒙逼 但是这样保证了每次取前驱后继时不会越界 这两个节点的角色就相当于数组中的啊a[0]和a[n+1]

题目很坑逼 数据范围不给 循环次数可能是负数

还要注意longlong不能用max/min 必须手写

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define N 0x3f3f3f3f3f3f3f3fll getmin(ll a,ll b);
struct node;
node *null;struct node
{node *fa,*ch[2];int sz,rev;ll val,minn,laz;void wipe(){fa=ch[0]=ch[1]=null;sz=1,val=0,minn=N,laz=0,rev=0;}int getd(){return fa->ch[1]==this;}void setc(node *tmp,int d){ch[d]=tmp;tmp->fa=this;}void add(ll tlaz){if(this==null) return;val+=tlaz,minn+=tlaz,laz+=tlaz;}void reverse(){if(this==null) return;swap(ch[0],ch[1]);rev^=1;}void pushup(){sz=ch[0]->sz+ch[1]->sz+1;minn=N;if(ch[0]!=null) minn=min(minn,min(ch[0]->val,ch[0]->minn));if(ch[1]!=null) minn=min(minn,min(ch[1]->val,ch[1]->minn));}void pushdown(){if(laz!=0){ch[0]->add(laz);ch[1]->add(laz);laz=0;}if(rev!=0){ch[0]->reverse();ch[1]->reverse();rev=0;}}
};node pool[200010];
node *root,*tail;
ll ary[100010];
int n,q;void build(node *&cur,node *fa,int l,int r)
{int m;if(l>r) return;m=(l+r)/2;cur=tail++;cur->wipe();cur->fa=fa;cur->val=ary[m],cur->minn=N,cur->laz=0,cur->rev=0;build(cur->ch[0],cur,l,m-1);build(cur->ch[1],cur,m+1,r);cur->pushup();
}void init()
{node *tmp;tail=pool;null=tail++;null->fa=null->ch[0]=null->ch[1]=null;null->sz=0,null->val=0,null->minn=N,null->laz=0,null->rev=0;tmp=tail++;tmp->wipe();root=tmp;tmp=tail++;tmp->wipe();root->setc(tmp,1);build(root->ch[1]->ch[0],root->ch[1],1,n);root->ch[1]->pushup();root->pushup();
}node *getkth(node *r,int k)
{node *cur;cur=r;cur->pushdown();while(cur->ch[0]->sz+1!=k){if(cur->ch[0]->sz+1>k){cur=cur->ch[0];}else{k-=(cur->ch[0]->sz+1);cur=cur->ch[1];}cur->pushdown();}return cur;
}void rotate(node *cur)
{node *f,*ff;int c,cc;f=cur->fa,ff=cur->fa->fa;f->pushdown();cur->pushdown();c=cur->getd(),cc=f->getd();f->setc(cur->ch[!c],c);cur->setc(f,!c);if(ff->ch[cc]==f) ff->setc(cur,cc);else cur->fa=ff;f->pushup();
}void splay(node *&root,node *tar,node *cur)
{while(cur->fa!=tar){if(cur->fa->fa==tar) rotate(cur);else{cur->fa->fa->pushdown();cur->fa->pushdown();cur->pushdown();if(cur->getd()==cur->fa->getd()) rotate(cur->fa);else rotate(cur);rotate(cur);}}cur->pushup();if(tar==null) root=cur;
}void insert(node *&cur,node *fa,ll val)
{cur=tail++;cur->wipe();cur->fa=fa;cur->val=val,cur->minn=N,cur->laz=0,cur->rev=0;
}
ll getmin(ll a,ll b)
{if(a<b) return a;else return b;
}void show()
{node *ptr;int i;printf("******\n");for(i=2;i<=n+1;i++){ptr=getkth(root,i);printf("%I64d ",ptr->val);}printf("\n");printf("******\n");
}int main()
{ll val,len;int i,l,r;char op[10];scanf("%d",&n);for(i=1;i<=n;i++){scanf("%I64d",&ary[i]);}init();scanf("%d",&q);while(q--){scanf("%s",op);if(strcmp(op,"ADD")==0){scanf("%d%d%I64d",&l,&r,&val);splay(root,null,getkth(root,l));splay(root,root,getkth(root,r+2));root->ch[1]->ch[0]->add(val);root->ch[1]->pushup();root->pushup();}else if(strcmp(op,"REVERSE")==0){scanf("%d%d",&l,&r);splay(root,null,getkth(root,l));splay(root,root,getkth(root,r+2));root->ch[1]->ch[0]->reverse();root->ch[1]->pushup();root->pushup();}else if(strcmp(op,"REVOLVE")==0){scanf("%d%d%I64d",&l,&r,&val);//val=max(val,0ll);len=r-l+1;if(len==1) continue;val+=1000000000ll*len;if(val%len!=0){val%=len;//printf("^^^%I64d^^^\n",val);splay(root,null,getkth(root,l));splay(root,root,getkth(root,r+2));root->ch[1]->ch[0]->reverse();root->ch[1]->pushup();root->pushup();if(val>1){splay(root,null,getkth(root,l));splay(root,root,getkth(root,l+val+1));root->ch[1]->ch[0]->reverse();root->ch[1]->pushup();root->pushup();}if(r-l-val+1>1){splay(root,null,getkth(root,l+val));splay(root,root,getkth(root,r+2));root->ch[1]->ch[0]->reverse();root->ch[1]->pushup();root->pushup();}}}else if(strcmp(op,"INSERT")==0){scanf("%d%I64d",&l,&val);splay(root,null,getkth(root,l+1));splay(root,root,getkth(root,l+2));insert(root->ch[1]->ch[0],root->ch[1],val);root->ch[1]->pushup();root->pushup();}else if(strcmp(op,"DELETE")==0){scanf("%d",&l);splay(root,null,getkth(root,l));splay(root,root,getkth(root,l+2));root->ch[1]->ch[0]=null;root->ch[1]->pushup();root->pushup();}else{scanf("%d%d",&l,&r);splay(root,null,getkth(root,l));splay(root,root,getkth(root,r+2));printf("%I64d\n",getmin(root->ch[1]->ch[0]->val,root->ch[1]->ch[0]->minn));//printf("$$$%lld %lld$$$\n",root->ch[1]->ch[0]->val,root->ch[1]->ch[0]->minn);}//show();}return 0;
}/*
10
1 4 7 8 9 6 3 2 5 10
10
REVERSE 3 8
REVOLVE 5 10 -2147483647
DELETE 1
INSERT 0 5
INSERT 10 4
REVOLVE 1 11 -1111111111
REVOLVE 1 11 5
ADD 8 11 2
MIN 1 6
MIN 8 1110
1 2 3 4 5 6 7 8 9 10
15
ADD 4 8 3
MIN 5 7
MIN 7 10
REVERSE 2 5
MIN 2 6
MIN 2 3
INSERT 3 4
MIN 3 4
MIN 5 10
DELETE 6
MIN 3 5
MIN 4 4
REVOLVE 3 6 7
MIN 5 8
MIN 7 10
*/

SuperMemo POJ - 3580相关推荐

  1. POJ 3580 SuperMemo

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

  2. POJ 3580. SuperMemo

    Description Input The first line contains n (n ≤ 100000). The following n lines describe the sequenc ...

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

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

  4. POJ 3580 SuperMemo 伸展树

    题意: 维护一个序列,支持如下几种操作: ADD x y D:将区间\([x,y]\)的数加上\(D\) REVERSE x y:翻转区间\([x,y]\) REVOLVE x y T:将区间\([x ...

  5. poj 3580 splay

    维修数列的简化版,要求的操作还是挺多的,运行时间大概1s. 1 #include <iostream> 2 #include <cstring> 3 #include < ...

  6. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  7. POJ 3268 D-Silver Cow Party

    http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  8. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  9. POJ 2528 Mayor's posters(线段树)

    题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...

  10. POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)

    题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...

最新文章

  1. TM:宿主-细菌界面的MicroRNA:宿主防御或细菌攻击
  2. pytorch cycleGAN代码学习1
  3. 对不起!今天我们的活动在朋友圈刷屏了……(多图预警)
  4. [转帖]linux下的X server:linux图形界面原理
  5. [WEKA]如何将英文文本数据集转换为ARFF格式
  6. 【ASP.NET Core 沉思录】CreateWebHostBuilder 是一个 Convension
  7. 《红色警戒3》新单位详细介绍:忍者
  8. RIP juniper
  9. Unity 3D 游戏开发学习资料集合(开发必备)
  10. Ubuntu16.04安装caffe教程(同时安装tensorflow与Pytorch)
  11. [汇总]计算机专业相关证书大全(持续更新...)
  12. C++ 实现扫雷小游戏
  13. IE的Internet选项“自定义级别”置灰,不能修改的问题解决
  14. HTML+CSS大作业——动画漫展学习资料电影模板(6页) 网页设计作业 _ 动漫网页设计作业,网页设计作业 _ 动漫网页设计成品,网页设计作业 _ 动漫网页设计成品模板下载
  15. 【虚拟仿真】Unity3D中如何实现让3D模型显示在UI前面
  16. 【团队管理系列】团队管理方面的量化数据
  17. LC3环境下的汇编语言程序调试攻略
  18. 深度分析网络游戏运营手段
  19. win7开启超级管理员账户(Administrator)
  20. 利用USB接口转串口芯片,做一个简单的闪光灯

热门文章

  1. google之admob
  2. 计算机高考计划,职中高三计算机高考复习计划
  3. 五大云存储服务对比:iCloud、Google...
  4. 我的世界java版骨头指令_我的世界:如何调出“啃骨头”隐藏皮肤?1个没人知道的mc彩蛋...
  5. Ubuntu18.04 使用gnome-tweak美化系统主题
  6. JMM理论二:相关概念——重排序、内存屏障、数据依赖、as-if-serial、final、Happen-Before
  7. Spinner的用法(转)
  8. php revel,Revel命令行工具源码阅读
  9. 一款好用的WEB版报表工具、报表设计器
  10. Java学习笔记-Lambda表达式