题意原题很清楚了。

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

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

#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. python 操作Memcached

    启动Memcached memcached -d -m 10 -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid 参数说明: -d ...

  2. C实现单链表

    typedef int DataType; typedef struct ListNode { DataType data; struct ListNode* next; }ListNode; //初 ...

  3. JAVA_SE基础——8.基本数据类型

    基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...

  4. Ubuntu命令行连接WPA/WPA2无线网线

    一,连接无加密无线网络zhang:sudo ip link set wlan0 up sudo iw dev wlan0 connect zhangsudo dhclient wlan0 二,连接WP ...

  5. LeetCode & Q414-Third Maximum Number-Easy

    Array Math Description: Given a non-empty array of integers, return the third maximum number in this ...

  6. CRC 校验

    匠心零度 转载请注明原创出处,谢谢! 说明 上篇RocketMQ(二):RPC通讯介绍了rocketmq的一些rpc细节,其实这些内容不仅仅是rocketmq内容,任何通信模块基本都是类似的,这块内容 ...

  7. confluence搭建详情

    Confluence安装&破解&汉化 编辑时间: 2017年7月7日18:01:13 1.介绍 Atlassian Confluence(简称Confluence)是一个专业的wiki ...

  8. Vue框架axios请求(类似于ajax请求)

    Vue框架axios get请求(类似于ajax请求) 首先介绍下,这个axios请求最明显的地方,通过这个请求进行提交的时候页面不会刷新 <!DOCTYPE html> <html ...

  9. 关于PHP包含文件的方法

    Begin 今天陆陆续续在重新写一些后台程序,用到了一些共用的PHP文件,所以顺便学习了一下几种包含文件方式 include 最常用的包含文件方法,如果遇到错误会显示warning,但是不会影响下面脚 ...

  10. 工作笔记 | Visual Studio 调用 Web Service

    引言 最近笔者负责ERP财务系统跟中粮集团财务公司的财务系统做对接,鉴于ERP系统中应付结算单结算量比较大,而且管理相对集中,ERP系统与中粮财务公司的支付平台系统对接,实现银企直联,将网银录入的环节 ...