【BZOJ1500】【Noi2005】维修数列
题意原题很清楚了。
解题思路:裸的平衡树操作,注意动态开点即可。
细节还是比较多的,具体参见代码吧。。。
#include <stdio.h>
#include <algorithm>
#define r register
#define max(a,b) ((a)>(b)?(a):(b))
inline int in(){
r int x=;r bool f=;r char c;
for (;(c=getchar())<''||c>'';) f=c=='-';
for (x=c-'';(c=getchar())>=''&&c<='';) x=(x<<)+(x<<)+c-'';
return f?-x:x;
}
namespace Treap{
inline int Rand(){
static int x=;
return x^=x<<,x^=x>>,x^=x<<;
}
struct node{
node *ls,*rs; bool rev,sam;
int val,sz,pri,sum,lx,rx,mx;
node(int x):val(x),sz(),pri(Rand()){sum=mx=lx=rx=val,rev=sam=,ls=rs=NULL;}
inline void reverse(){
std::swap(ls,rs);
if(ls) ls->rev^=,std::swap(ls->lx,ls->rx);
if(rs) rs->rev^=,std::swap(rs->lx,rs->rx);
}
inline void combine(){
sum=mx=lx=rx=val;
sz=;
if(ls) sum+=ls->sum,sz+=ls->sz;
if(rs) sum+=rs->sum,sz+=rs->sz;
if(ls){
lx=ls->lx;
lx=max(lx,ls->sum+val);
if(rs) lx=max(lx,ls->sum+val+rs->lx);
}else if(rs) lx=max(lx,val+rs->lx);
if(rs){
rx=rs->rx;
rx=max(rx,rs->sum+val);
if(ls) rx=max(rx,rs->sum+val+ls->rx);
}else if(ls) rx=max(rx,val+ls->rx);
if(ls){
mx=max(mx,ls->mx);
mx=max(mx,ls->rx+val);
}
if(rs){
mx=max(mx,rs->mx);
mx=max(mx,rs->lx+val);
}
if(ls&&rs) mx=max(mx,ls->rx+val+rs->lx);
}
inline void pushdown(){
if (sam){
if (ls){
ls->val=val;
ls->sum=ls->sz*val;
ls->sam=;
if (val>) ls->mx=ls->lx=ls->rx=ls->sum;
else ls->mx=ls->lx=ls->rx=val;
}
if (rs){
rs->val=val;
rs->sum=rs->sz*val;
rs->sam=;
if (val>) rs->mx=rs->lx=rs->rx=rs->sum;
else rs->mx=rs->lx=rs->rx=val;
}sam=;
}
if (rev) reverse(),rev=;
}
}*root;
struct Droot{node *a,*b;};
inline int Size(node *x){return x?x->sz:;}
node *merge(node *a,node *b){
if (!a) return b;
if (!b) return a;
if (a->pri<b->pri){
a->pushdown();
a->rs=merge(a->rs,b);
a->combine();
return a;
}else{
b->pushdown();
b->ls=merge(a,b->ls);
b->combine();
return b;
}
}
Droot split(node *x,int k){
if (!x) return (Droot){NULL,NULL};
r Droot y; x->pushdown();
if (Size(x->ls)>=k){
y=split(x->ls,k);
x->ls=y.b;
x->combine();
y.b=x;
}else{
y=split(x->rs,k-Size(x->ls)-);
x->rs=y.a;x->combine();y.a=x;
}return y;
}
inline void trash(node *&x){
if (!x) return;
trash(x->ls),trash(x->rs);
delete x;x=NULL;
}
inline int Get_Sum(int s,int l){
if (l==) return ;
r Droot x=split(root,s-);
r Droot y=split(x.b,l);
r int ans=y.a->sum;
root=merge(merge(x.a,y.a),y.b);
return ans;
}
inline int Get_Max(){return root?root->mx:;}
inline void Delete(int s,int l){
r Droot x=split(root,s-);
r Droot y=split(x.b,l);
root=merge(x.a,y.b);trash(y.a);
}
inline void Make_Same(int s,int l,int val){
r Droot x=split(root,s-);
r Droot y=split(x.b,l);
y.a->val=val;y.a->sam=;y.a->rev=,y.a->sum=y.a->sz*val;
if (val>) y.a->mx=y.a->lx=y.a->rx=y.a->sum;
else y.a->mx=y.a->lx=y.a->rx=val;
root=merge(merge(x.a,y.a),y.b);
}
inline void Reverse(int s,int l){
r Droot x=split(root,s-);
r Droot y=split(x.b,l);
y.a->rev=; std::swap(y.a->lx,y.a->rx);
root=merge(merge(x.a,y.a),y.b);
}
inline node *insert(int k){
if (!k) return NULL;
if (k==){
r node *ans=new node(in());
return ans;
}
r node *a,*b;
a=insert(k>>);
b=insert(k-(k>>));
return merge(a,b);
}
inline void Insert(){
r int pos=in(),n=in();
r node *ans=insert(n);
r Droot x=split(root,pos);
root=merge(merge(x.a,ans),x.b);
}
}using namespace Treap;int n,q;
void init(){n=in(),q=in();root=insert(n);}
void solve(){
while(q--){
r char op[];scanf("%s",op);
if (op[]=='M'){
if (op[]=='K'){
r int x=in(),n=in();
Make_Same(x,n,in());
}else printf("%d\n",Get_Max());
}
else{
switch(op[]){
case 'I':Insert();break;
case 'D':{r int x=in();Delete(x,in());break;}
case 'R':{r int x=in();Reverse(x,in());break;}
case 'G':{r int x=in();printf("%d\n",Get_Sum(x,in()));break;}
}
}
}
}
int main(){init(); solve(); return ;}
【BZOJ1500】【Noi2005】维修数列的更多相关文章
- [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号节点和首尾的两个虚拟 ...
- [bzoj1500][NOI2005]维修数列_非旋转Treap
维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...
- splay模板三合一 luogu2042 [NOI2005]维护数列/bzoj1500 [NOI2005]维修数列 | poj3580 SuperMemo | luogu3391 【模板】文艺平衡树(Splay)
先是维修数列 题解看这里,但是我写的跑得很慢 #include <iostream> #include <cstdio> using namespace std; int n, ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- BZOJ1500: [NOI2005]维修数列[splay ***]
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 12278 Solved: 3880[Submit][Statu ...
- [bzoj1500][NOI2005]维修数列——splay
题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...
- BZOJ1500 [NOI2005]维修数列-fhq_Treap
题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 ...
- BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】
以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...
随机推荐
- 学号:201621123032 《Java程序设计》第7周学习总结
1:本周学习总结 1.1:思维导图:Java图形界面总结 2:书面作业 2.1: GUI中的事件处理 2.1.1: 写出事件处理模型中最重要的几个关键词 事件:如鼠标单击,滑动,输入汉字等. 事件源: ...
- 初谈Git(本机克隆项目远程仓库)
1. 码云注册与新建项目 注册并新建项目 2. Git安装并配置 安装 配置 3. clone项目 附:一些Git命令 git clone 拷贝并跟踪远程的master分支 git add 跟踪新文件 ...
- python day1 基本语法作业
一.过7 start =1 while start<=10: if start !=7: print(start) start +=1 二.100以内的和 sum = 0 start = 1 w ...
- python自动发邮件
from email.header import Header from email.mime.text import MIMEText from email.utils import parsead ...
- 201421123042 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 Comparable Arrays.sort -has a Lambda表达式 1.2尝试使用思维导图将这些关键词组织起来 ...
- 不高兴的小名 nyoj
不高兴的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 小明又出问题了.妈妈认为聪明的小明应该更加用功学习而变的更加厉害,所以小明除了上学之外,还要参加妈 ...
- CSS你所不知的伪元素的用法
你所不知的 CSS ::before 和 ::after 伪元素用法 博客分类: Div / Css / XML / HTML5 CSS 有两个说不上常用的伪类 :before 和 :after, ...
- Django-rest-framework源码分析----权限
添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permission.py class SVIPPr ...
- Python之旅_第一章Python入门
一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...
- Aache的虚拟主机配置虚拟目录
3. 打开 httpd.conf 文件, 添加如下代码: # Virtual hosts Include conf/extra/httpd-vhosts.conf 如果已存在,将Include前面的# ...