[bzoj1500][NOI2005]维修数列[Treap][可持久化Treap]
非旋转式Treap1500 :)
#include <bits/stdc++.h>
#pragma GCC optimize(3) using namespace std; const int INF=0x3f3f3f3f; struct node
{
int val,key,size;
int sum,lx,rx,mx,revf,chgf;
node *l,*r;
node() { }
node(const int x)
{
mx=val=sum=x; key=rand();
size=; lx=rx=(x>?x:);
chgf=INF; revf=; l=r=;
} void push_down()
{
if(chgf!=INF)
{
sum=chgf*size;
val=chgf;
lx=rx=(chgf>=?sum:);
mx=(chgf>=?sum:chgf);
if(l) l->chgf=chgf;
if(r) r->chgf=chgf;
chgf=INF; revf=;
}
if(revf)
{
if(l)l->revf^=;
if(r)r->revf^=;
swap(l,r);
swap(lx,rx);
revf=;
} return ;
} void update()
{
if(l)l->push_down();
if(r)r->push_down();
sum=(l?l->sum:)+(r?r->sum:)+val;
size=(l?l->size:)+(r?r->size:)+;
mx=max(max((l?l->mx:-INF),(r?r->mx:-INF)),
(l?l->rx:)+(r?r->lx:)+val);
lx=max((l?l->lx:), (l?l->sum:)+val+(r?r->lx:));
rx=max((r?r->rx:), (r?r->sum:)+val+(l?l->rx:));
return ;
} }U[],*Trash[],*ALL=U; int top; node * ALLOC(const int x)
{
return new(top?Trash[top--]:++ALL)node(x);
} void RECYCLE(node * t)
{
if(!t)return ;
RECYCLE(t->l);
RECYCLE(t->r);
Trash[++top]=t;
return ;
} struct Treap
{
typedef pair<node *,node *> PNN;
public:
Treap() { root=; } private: node * root; node * merge(node * t1,node * t2)
{
if(!t1) return t2; if(!t2) return t1;
t1->push_down(); t2->push_down();
if(t1->key < t2->key)
return t1->r=merge(t1->r,t2),t1->update(),t1;
return t2->l=merge(t1,t2->l),t2->update(),t2;
} PNN split(node * t,const int pos)
{
if(t) t->push_down();
if(!t) return make_pair((node*),(node*));
if(!pos) return make_pair((node*),t);
if(t->l && t->l->size==pos)
{
node * temp=t->l;
return t->l=,t->update(),make_pair(temp,t);
}
if(t->l && t->l->size+==pos)
{
node * temp=t->r;
return t->r=,t->update(),make_pair(t,temp);
}
if(t->l && t->l->size>pos)
{
PNN temp=split(t->l,pos);
return t->l=temp.second,t->update(),
make_pair(temp.first,t);
}
if(!t->r) return make_pair(t,(node*));
PNN temp=split(t->r,pos-(t->l?t->l->size:)-);
return t->r=temp.first,t->update(),make_pair(t,temp.second);
} node * build(const int * A,const int N)
{
stack<node *> stk; node * temp=;
for(int i=;i<N;++i)
{
node * t=ALLOC(A[i]);
while(!stk.empty() && t->key<stk.top()->key)
temp=stk.top(),temp->update(),stk.pop();
if(!stk.empty())
{
t->l=stk.top()->r;
t->update();
stk.top()->r=t;
stk.top()->update();
stk.push(t);
}
else
{
t->l=temp;
t->update();
stk.push(t);
}
}
while(!stk.empty()) temp=stk.top(),temp->update(),stk.pop();
return temp;
} public:
void insert(const int pos,const int * A,const int N)
{
PNN t=split(root,pos);
t.first=merge(t.first,build(A,N));
root=merge(t.first,t.second);
return ;
} void erase(const int l,const int r)
{
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
RECYCLE(t2.first);
root=merge(t1.first,t2.second);
} void make_same(const int l,const int r,const int d)
{
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
t2.first->chgf=d;
t2.first->push_down();
root=merge(t1.first,merge(t2.first,t2.second));
} void reverse(const int l,const int r)
{
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
t2.first->revf^=;
t2.first->push_down();
root=merge(t1.first,merge(t2.first,t2.second));
} int get_sum(const int l,const int r)
{
if(l>r)return ;
PNN t1=split(root,l-);
PNN t2=split(t1.second,r-l+);
t2.first->push_down();
int temp=t2.first->sum;
root=merge(t1.first,merge(t2.first,t2.second));
return temp;
} int max_sum()
{
PNN t1=split(root,);
PNN t2=split(t1.second,root->size);
t2.first->push_down();
int temp=t2.first->mx;
root=merge(t1.first,merge(t2.first,t2.second));
return temp;
}
}S; int n,m,x,y,z;
int a[];
char op[]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;++i) scanf("%d",&a[i]);
S.insert(,a,n);
while(m--)
{
scanf("%s",op);
if(op[]=='S') // Insert
{
scanf("%d%d",&x,&y);
for(int i=;i<y;++i) scanf("%d",&a[i]);
S.insert(x,a,y);
}
if(op[]=='L') // Delete
{
scanf("%d%d",&x,&y);
S.erase(x,x+y-);
}
if(op[]=='K') // Make_same
{
scanf("%d%d%d",&x,&y,&z);
S.make_same(x,x+y-,z);
}
if(op[]=='V') // Reverse
{
scanf("%d%d",&x,&y);
S.reverse(x,x+y-);
}
if(op[]=='T') // Get_sum
{
scanf("%d%d",&x,&y);
printf("%d\n",S.get_sum(x,x+y-));
}
if(op[]=='X') // Max_sum
{
printf("%d\n",S.max_sum());
}
} return ;
}
[bzoj1500][NOI2005]维修数列[Treap][可持久化Treap]的更多相关文章
- [bzoj1500][NOI2005]维修数列_非旋转Treap
维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...
- 2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)
传送门 平衡树好题. 我仍然是用的fhqtreap,感觉速度还行. 维护也比线段树splay什么的写起来简单. %%%非旋treap大法好. 代码: #include<bits/stdc++.h ...
- [BZOJ1500][NOI2005]维修数列---解题报告
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- [BZOJ1500][NOI2005]维修数列 解题报告 Splay
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...
- splay模板三合一 luogu2042 [NOI2005]维护数列/bzoj1500 [NOI2005]维修数列 | poj3580 SuperMemo | luogu3391 【模板】文艺平衡树(Splay)
先是维修数列 题解看这里,但是我写的跑得很慢 #include <iostream> #include <cstdio> using namespace std; int n, ...
- BZOJ1500[NOI2005]维修数列——非旋转treap
题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 输入 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初 ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- BZOJ1500 [NOI2005]维修数列-fhq_Treap
题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 ...
随机推荐
- css3中的变换、动画和过渡
变换:分为2d变换和3d变换,但一次只能用一个变换属性,多个的话最后一个会覆盖前面所有最终被浏览器实现,变换可以成为过渡和动画的一个待变参数(类似width,opacity等). 过渡:是动画的初始模 ...
- iOS Programming Localization 本地化
iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...
- 5.4QBXT 模拟赛 (Rank1 机械键盘 蛤蛤)
NOIP2016提高组模拟赛 ——By wangyurzee7 中文题目名称 纸牌 杯具 辣鸡 英文题目与子目录名 cards cups spicychicken 可执行文件名 cards cups ...
- Bash Template
#/bin/bash #set -x set -e usage() { cat <<EOF Usage: `basename $` [OPTIONS] <non-option arg ...
- .Net Core 真能令微软的.Net 跨平台“蔓延”?
什么是.Net .Net 本身就是基于公共语言基础架构(CLI)实现的平台独立的公共语言开发平台,只是自2006年成为规范以来的CLI,只有Windows自己支持罢了(mono除外).微软的.Net ...
- C++学习随笔
今天试着变了下实验二里边的有关面向对象的实验,深深地觉得我对面向对象的编程的理解还是很浅显,以至于对于对象的调用也是瞎整.居然直接就去调用继承来的函数,连生成一个对象这种基础应用都不知道.对自己的基础 ...
- 谈谈如何来查看GC日志
一.首先来看一下JVM中的GC有哪几种类型? 1.-XX:UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后,使用Serial+Serial Old收集器组合进行垃圾收集. ...
- HTML head meta标签详细
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- java图片放大或缩小
package org.jimmy.autotranslate20181022.utils; import java.awt.Graphics; import java.awt.image.Buffe ...
- 关于Maven项目的pom.xml中的依赖或插件失效的解决方法
1.请将<dependency>标签包含的依赖从<dependencyManagement>中拿出来,单独放在<dependencies>标签里面.2.请将< ...