BZOJ 1500 Splay 全操作
好久没写splay了,写一发(写了一节课,调了一节课)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stack>
#define mp make_pair
#define pa pair<int,int>
#define pb push_back
#define fi first
#define se second
#define Key Root->ch[1]->ch[0]
using namespace std;
inline void Get_Int(int &x)
{
x=; register char ch=getchar(); int f=;
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();} x*=f;
}
inline void Put_Int(int x)
{
char ch[]; register int top=;
if (x<) putchar('-'),x=-x;
if (x==) ch[++top]='';
while (x) ch[++top]=x%+'',x/=;
while (top) putchar(ch[top--]); putchar('\n');
}
inline int Max(int x,int y) {return x>y?x:y;}
inline int Max3(int x,int y,int z) {return Max(x,Max(y,z));}
inline void Swap(int &x,int &y) {int t=x;x=y;y=t;}
inline bool StrCmp(char S1[],char S2[]) {for (int i=;i<;i++) if (S1[i]!=S2[i]) return false; return true;}
//=============================================
const int Maxn=;
const int Inf=0x3f3f3f3f;
int a[Maxn],pos,tot,c,n,m,Point;
char str[];
struct Node
{
int lx,rx,mx,sum,size,key,rev,same;
Node * pre,* ch[];
inline int d() {return this->pre->ch[]==this;}
inline void Setc(Node * r,int d) {r->pre=this; this->ch[d]=r;}
};
inline void Swap(Node *&x,Node *&y) {Node * T=x;x=y;y=T;}
Node Memory[Maxn],* port=Memory,* tmp[Maxn],* Bin[Maxn],* null=port++,* Root;
inline Node * NewNode(Node * f,int v)
{
Node * ret;
if (Point) ret=Bin[Point--]; else ret=port++;
ret->ch[]=ret->ch[]=null;
ret->size=,ret->pre=f;
ret->key=ret->lx=ret->rx=ret->mx=ret->sum=v;
ret->same=ret->rev=;
return ret;
}
inline void Get_Rev(Node * x)
{
if (x==null) return;
Swap(x->ch[],x->ch[]);
Swap(x->lx,x->rx);
x->rev^=;
}
inline void Get_Same(Node * x,int v)
{
if (x==null) return;
x->key=v;
x->sum=x->size*v;
x->lx=x->rx=x->mx=Max(v,x->size*v);
x->same=;
}
inline void Push_Up(Node * x)
{
if (x==null) return;
x->size=x->ch[]->size+x->ch[]->size+;
x->sum=x->ch[]->sum+x->ch[]->sum+x->key;
x->lx=Max(x->ch[]->lx,x->ch[]->sum+x->key+Max(x->ch[]->lx,));
x->rx=Max(x->ch[]->rx,x->ch[]->sum+x->key+Max(x->ch[]->rx,));
x->mx=Max3(x->ch[]->mx,x->ch[]->mx,Max(x->ch[]->rx,)+x->key+Max(x->ch[]->lx,));
}
inline void Push_Down(Node * x)
{
if (x==null) return;
if (x->rev)
{
Get_Rev(x->ch[]);
Get_Rev(x->ch[]);
x->rev=;
}
if (x->same)
{
Get_Same(x->ch[],x->key);
Get_Same(x->ch[],x->key);
x->same=;
}
}
Node * Build(int l,int r,Node * f)
{
if (l>r) return null;
int mid=(l+r)>>;
Node * ret=NewNode(f,a[mid]);
ret->ch[]=Build(l,mid-,ret);
ret->ch[]=Build(mid+,r,ret);
Push_Up(ret);
return ret;
}
inline void Init()
{
null->ch[]=null->ch[]=null->pre=null;
null->size=null->key=null->sum=null->same=null->rev=;
null->lx=null->rx=null->mx=-Inf;
Root=NewNode(null,-);
Root->ch[]=NewNode(Root,-);
for (int i=;i<=n;i++) Get_Int(a[i]);
Key=Build(,n,Root->ch[]);
Push_Up(Root->ch[]),Push_Up(Root);
}
//=========================================================
inline void Rotate(Node * x)
{
Node * y=x->pre; int d=x->d();
y->pre->Setc(x,y->d());
y->Setc(x->ch[!d],d);
x->Setc(y,!d);
Push_Up(y);
}
void Splay(Node * x,Node * Goal)
{
int s=; tmp[]=x; Node * r=x;
while (r->pre!=null) tmp[++s]=r=r->pre;
while (s) Push_Down(tmp[s--]);
while (x->pre!=Goal)
if (x->pre->pre==Goal) Rotate(x); else
(x->pre->d()==x->d())?(Rotate(x->pre),Rotate(x)):(Rotate(x),Rotate(x));
Push_Up(x);
if (Goal==null) Root=x;
}
//===========================================================
Node * Get_K(Node * x,int k)
{
Push_Down(x);
int t=x->ch[]->size+;
if (t==k) return x;
if (t>k) return Get_K(x->ch[],k);
else return Get_K(x->ch[],k-t);
}
inline void Handle(int pos,int tot)
{
Splay(Get_K(Root,pos),null);
Splay(Get_K(Root,pos+tot+),Root);
}
inline void Insert()
{
Get_Int(pos),Get_Int(n);
Handle(pos+,);
for (int i=;i<=n;i++) Get_Int(a[i]);
Key=Build(,n,Root->ch[]);
Push_Up(Root->ch[]),Push_Up(Root);
}
void Erase(Node * x)
{
if (x==null) return;
Erase(x->ch[]),Erase(x->ch[]);
Bin[++Point]=x;
}
inline void Delete()
{
Get_Int(pos),Get_Int(tot);
Handle(pos,tot);
Erase(Key); Key->pre=null; Key=null;
Push_Up(Root->ch[]),Push_Up(Root);
}
inline void Same()
{
Get_Int(pos),Get_Int(tot),Get_Int(c);
Handle(pos,tot);
Get_Same(Key,c);
Push_Up(Root->ch[]),Push_Up(Root);
}
inline void Rev()
{
Get_Int(pos),Get_Int(tot);
Handle(pos,tot);
Get_Rev(Key);
Push_Up(Root->ch[]),Push_Up(Root);
}
inline void Sum()
{
Get_Int(pos),Get_Int(tot);
Handle(pos,tot);
Put_Int(Key->sum);
}
inline void MaxSum()
{
Handle(,Root->size-);
Put_Int(Key->mx);
}
void InOrder(Node * x)
{
if (x==null) return;
Push_Down(x);
InOrder(x->ch[]);
printf("%d ",x->key);
InOrder(x->ch[]);
} int main()
{
Get_Int(n),Get_Int(m);
Init();
for (int i=;i<=m;i++)
{
scanf("%s",str);
if (StrCmp(str,"INSERT")) Insert();
if (StrCmp(str,"DELETE")) Delete();
if (StrCmp(str,"MAKE-SAME")) Same();
if (StrCmp(str,"REVERSE")) Rev();
if (StrCmp(str,"GET-SUM")) Sum();
if (StrCmp(str,"MAX-SUM")) MaxSum();
}
return ;
}
傻逼200+系列..
BZOJ 1500 Splay 全操作的更多相关文章
- BZOJ 1500 splay终结版...
GSS系列有一丝丝像- 只不过那个是线段树 这个是splay 翻转 插入 删除啥的就是普通的splay 合在一起了而已 //By SiriusRen #include <cstdio> # ...
- [BZOJ 1500] [NOI2005] 维修数列
题目链接:BZOJ - 1500 题目分析 我要先说一下,这道题我写了一晚上,然后Debug了一整个白天..........再一次被自己的蒟蒻程度震惊= = 这道题是传说中的Splay维护数列的Bos ...
- [BZOJ 1500] 维护序列
Link: BZOJ 1500 传送门 Solution: 可能平衡树维护序列的所有操作都在这了吧…… 对序列的维护$fhq treap$和$Splay$都能做 有几个注意点: 1.维护序列时始终记得 ...
- C语言链表全操作(增,删,改,查,逆序,递增排序,递减排序,链式队列,链式栈)
一,数据结构——链表全操作: 链表形式: 其中,每个节点(Node)是一个结构体,这个结构体包含数据域,指针域,数据域用来存放数据,指针域则用来指向下一个节点: 特别说明:对于单链表,每个节点(Nod ...
- BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】
以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...
- ROS tab键补全操作出现错误
ros tab键补全操作出现错误如下: $ roslaunch sp[rospack] Warning: error while crawling /home/hemudu: boost::files ...
- 机器学习进阶-图像基本操作-边界补全操作 1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 进行边界的补零操作 2.cv2.BORDER_REPLICATE(边界补零复制操作)...
1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 参数说明: i ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
随机推荐
- html5 svg动画
http://www.zhangxinxu.com/sp/svg/ 以上是svg的一个线上编辑器,也可以adobe Illustrator制作生成. 我们通过以上编辑器可以获得以下代码. 例: < ...
- 【Java】关于JVM运行时内存空间、JVM垃圾回收机制
参考的优秀文章 <深入理解Java虚拟机 JVM高级特性与最佳实线>(机械工业出版社) Java虚拟机的堆.栈.堆栈如何去理解? 聊聊JVM的年轻代 前言 本文是<深入理解Java虚 ...
- 复旦高等代数 I(15级)思考题
1.证明: 第三类分块初等变换是若干个第三类初等变换的复合. 特别地, 第三类分块初等变换不改变行列式的值. 2.设 $n\,(n\geq 2)$ 阶方阵 $A=(a_{ij}(x))$, 其中每个元 ...
- Python3基础 把一个列表中内容给另外一个列表,形成两个独立的列表
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- signtool
https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx C:\Users\Administrator\.nuget\packa ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- 单据类型BE构建
开发流程:BE--UI--发布在开发时有必要对元数据.代理调用.弱类型.强类型有所了解基本的单据开发包括单据类型BE.单据状态BE.单据BE,下面分别罗列出各单据的BE的设计开发: 本章主要讲解单据类 ...
- 《BI那点儿事》数据流转换——字符映射表
特征映射转换如图展示数据流中列的特征,它的编辑界面很简单,只有一个标签界面,点击要进行映射的列,可以选择需要添加新列或需要更新的列.可以在Output Alias列中给原来的列一个别名,选择要进行的操 ...
- 跨站脚本 XSS<一:防御方法>
1. 过滤特殊字符 避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤: PHP的htmlentities()或是htmlspecialchars(). Pytho ...
- mysql 命令(一)
1. 函数向日期添加指定的时间间隔 DATE_ADD(date,INTERVAL expr type)eg:DATE_ADD(CURDATE(),INTERVAL 1 MONTH) //在当前时间加一 ...