题意原题很清楚了。

解题思路:裸的平衡树操作,注意动态开点即可。

细节还是比较多的,具体参见代码吧。。。

#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】维修数列的更多相关文章

  1. [BZOJ1500][NOI2005]维修数列---解题报告

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  2. [BZOJ1500][NOI2005]维修数列 解题报告 Splay

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  3. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

  4. [bzoj1500][NOI2005]维修数列_非旋转Treap

    维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...

  5. splay模板三合一 luogu2042 [NOI2005]维护数列/bzoj1500 [NOI2005]维修数列 | poj3580 SuperMemo | luogu3391 【模板】文艺平衡树(Splay)

    先是维修数列 题解看这里,但是我写的跑得很慢 #include <iostream> #include <cstdio> using namespace std; int n, ...

  6. BZOJ1500[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  7. BZOJ1500: [NOI2005]维修数列[splay ***]

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

  8. [bzoj1500][NOI2005]维修数列——splay

    题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...

  9. BZOJ1500 [NOI2005]维修数列-fhq_Treap

    题面见这里 反正是道平衡树,就拿 fhq_Treap 写了写... 这道题思路基本是围绕“用 Treap 维护中序遍历” 和 中序遍历的性质 来进行的操作 所以就可以类比线段树进行一些操作 1. 建树 ...

  10. BZOJ1500: [NOI2005]维修数列 [splay序列操作]【学习笔记】

    以前写过这道题了,但我把以前的内容删掉了,因为现在感觉没法看 重写! 题意: 维护一个数列,支持插入一段数,删除一段数,修改一段数,翻转一段数,查询区间和,区间最大子序列 splay序列操作裸题 需要 ...

随机推荐

  1. 20162302 实验四《Android程序设计》实验报告

    实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:Android程序设计 实验器材:装有Android Studio的联想拯救者80RQ 实验目 ...

  2. I/O多路转接之poll 函数

    poll 一.poll()函数: 这个函数是某些Unix系统提供的用于执行与select()函数同等功能的函数,自认为poll和select大同小异,下面是这个函数的声明: #include < ...

  3. win7如何以管理员身份运行命令提示符(cmd)

    1.进入到: C:\Windows\System32 2.找到cmd.exe文件 3.右键单击 ,选择 以管理员身份运行.

  4. 大数据技术Hadoop笔试题

    Hadoop有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.以下是由应届毕业生网小编J.L为您整理推荐的面试笔试题目和经验,欢迎参考阅读. 单项选择题 1. 下面哪个程序负责 H ...

  5. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  6. ResNet

     上图为单个模型 VGGNet, GoogleNet 都说明了深度对于神经网络的重要性. 文中在开始提出: 堆叠越多的层, 网络真的能学习的越好吗? 然后通过神经网络到达足够深度后出现的退化(deg ...

  7. Project facet is Java version 1.7 is not spported

    在移植eclipse项目时,如果遇到 "Project facet Java version 1.7 is not supported." 项目中的jdk1.7不支持.说明项目是其 ...

  8. ES6常用新特性

    https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...

  9. nat和napt技术

    私网IP地址是指内部网络或主机的IP地址,公网IP地址是指在因特网上全球唯一的IP地址. RFC 1918为私有网络预留出了三个IP地址块,如下: A类:10.0.0.0-10.255.255.255 ...

  10. Python基础学习篇章二

    一. Python如何运行程序 1. 在交互模式下编写代码 最简单的运行Python程序的方法是在Python交互命令行中输入程序.当然有很多方法可以开始这样的命令行,比如IDE,系统终端.如果你已经 ...