【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序列操作裸题 需要 ...
随机推荐
- C语言程序设计第三次作业--选择结构(1)
Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...
- 201621123040《Java程序设计》第七周学习总结
1.本周学习总结 1.1思维导图:Java图形界面总结 2.书面作业 2.1GUI中的事件处理 2.1.1写出事件处理模型中最重要的几个关键词. 关键词:事件 事件源 事件监听器 2.1.2任意编写事 ...
- Entity Framework Core Code First
参考地址:https://docs.microsoft.com/zh-cn/ef/core/get-started/aspnetcore/new-db
- Linq 透明标识符
IEnumerable<Person> list = new List<Person> { , Id = }, , Id = }, , Id = }, , Id = }, , ...
- Python-模块使用-Day6
Python 之路 Day6 - 常用模块学习 本节大纲: 模块介绍time &datetime模块randomossysshutiljson & picleshelvexml处理ya ...
- iot:下一步要做的工作
1.DeviceMessage抽象(定义&支持扩展)2.createDeviceMessage.analyseDeviceMessage(支持扩展)3.日志打印4.错误处理5.断线重连6.交互 ...
- SpringBoot入门:新一代Java模板引擎Thymeleaf(实践)
菜鸟教程:http://www.runoob.com/ http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js http://apps.b ...
- maven常见问题处理(3-4)配置代理服务器
有的公司基于安全因素考虑,要求员工使用通过安全认证的代理访问因特网. 这时就需要为Maven配置HTTP代理. 在目录~/.m2/setting.xml文件中编辑如下(如果没有该文件,则复制$M2_H ...
- python 函数 装饰器 内置函数
函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...
- Centos7 安装python3
Centos7 安装python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #安装sqlite-devel yum -y ...