【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序列操作裸题 需要 ...
随机推荐
- CPP 栈 示例
#include<iostream> #include<stdlib.h> using namespace std; typedef struct node { int dat ...
- 原生ajax的请求函数
ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务器.发送请求.接收响应 ...
- JAVA_SE基础——25.面向对象练习
黑马程序员入学blog ... 昨晚我写了篇面向对象的内存分析,今天我们来做个小练习.. 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数. 名字. 颜色 ,还 具备跑的功能 ...
- JAVA_SE基础——1.JDK&JRE下载及安装
这是我学了JAVA来写的第一篇博客: 我首先是在传智播客领了张.毕向东老师的免费JAVA学习光盘来学习! 下面我来教大家安装使用JAVA时候必备的JDK 1.首先上甲骨文公司的官方网站下载JDK的安装 ...
- 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTtful API
上一篇写的是使用静态基类方法的实现步骤: http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...
- linux下执行java类(运行java定时器)
假如有一个定时器TimerTest.java import java.io.IOException; import java.util.Timer; public class TimerTest { ...
- Linux背景知识(1)RedHat和Centos
Redhat有收费的商业版和免费的开源版,商业版的业内称之为RHEL(Red Hat Enterprise Linux)系列, 而这个CentOS(Community ENTerprise Opera ...
- docker生态系统
我的docker学习笔记6-docker生态 1.镜像即应用 代码构建.持续集成和持续交付 DaoCloud.Quay.IO 2.催生容器托管caas服务 基 ...
- 官网jquery压缩版引用地址:
3.1.1版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- centos7配置Apache支持HTTPS
Apache版本2.4 安装mod_ssl yum install mod_ssl 建立文件夹,存放sslkey mkdir /etc/httpd/ssl/ 建立凭证档 openssl req -x5 ...