[bzoj1500][luogu2042][cogs339][codevs1758]维修数列(维护数列)
先给自己立一个flag
我希望上午能写完
再立一个flag
我希望下午能写完。
再立一个flag
我希望晚上能写完。。。
我终于A了。。。
6700+ms...(6728)
我成功地立了3个flag。。。
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<cstdlib>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define mp make_pair
typedef long long ll;
typedef pair<int,int> pr;
il int gi(){
rg int x=,f=;rg char ch=getchar();
while(ch<''||ch>'')f=ch=='-'?-:f,ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x*f;
}
#define Now t[now]
struct node{
int ls,rs,rand,size;
int data,sum,lmax,rmax,maxx;
bool rev,set;
int setnum;
il vd setdata(){data=setnum,sum=setnum*size,lmax=rmax=maxx=data>?sum:data,set=;}
}t[];
int stack[],top;
int root;
il int newnode(int data){
int now=stack[top];
Now.setnum=data,Now.setdata();
Now.rev=Now.set=;
Now.ls=Now.rs=;
Now.size=;
return stack[top--];
}
il vd down(int now){
if(Now.rev){
swap(Now.ls,Now.rs),swap(Now.lmax,Now.rmax);
t[Now.ls].rev^=,t[Now.rs].rev^=,Now.rev=;
}
if(Now.set){
Now.setdata();
t[Now.ls].set=,t[Now.ls].setnum=Now.setnum;
t[Now.rs].set=,t[Now.rs].setnum=Now.setnum;
}
}
il vd reset(int now){
if(Now.ls)down(Now.ls);
if(Now.rs)down(Now.rs);
Now.size=t[Now.ls].size+t[Now.rs].size+;
Now.sum=t[Now.ls].sum+t[Now.rs].sum+Now.data;
Now.lmax=t[Now.ls].sum+Now.data+max(t[Now.rs].lmax,);
Now.rmax=t[Now.rs].sum+Now.data+max(t[Now.ls].rmax,);
if(Now.ls)Now.lmax=max(Now.lmax,t[Now.ls].lmax);
if(Now.rs)Now.rmax=max(Now.rmax,t[Now.rs].rmax);
Now.maxx=max(t[Now.ls].rmax,)+max(t[Now.rs].lmax,)+Now.data;
if(Now.ls)Now.maxx=max(t[Now.ls].maxx,Now.maxx);
if(Now.rs)Now.maxx=max(Now.maxx,t[Now.rs].maxx);
}
il int merge(int a,int b){
if(!a||!b)return a|b;
if(t[a].rand<t[b].rand){down(a),t[a].rs=merge(t[a].rs,b),reset(a);return a;}
else {down(b),t[b].ls=merge(a,t[b].ls),reset(b);return b;}
}
il pr split(int now,int num){
if(!now)return mp(,);
down(now);
int ls=Now.ls,rs=Now.rs;
if(num==t[Now.ls].size){Now.ls=,reset(now);return mp(ls,now);}
if(num==t[Now.ls].size+){Now.rs=,reset(now);return mp(now,rs);}
if(num<t[Now.ls].size){
pr T=split(Now.ls,num);
Now.ls=T.second,reset(now);
return mp(T.first,now);
}else{
pr T=split(Now.rs,num-t[Now.ls].size-);
Now.rs=T.first,reset(now);
return mp(now,T.second);
}
}
il int build(int n){
int last;
int stk[n],tp=;
rep(i,,n){
int now=newnode(gi());last=;
while(tp&&t[stk[tp]].rand>Now.rand)reset(stk[tp]),last=stk[tp--];
if(tp)t[stk[tp]].rs=now;
Now.ls=last;
stk[++tp]=now;
}
while(tp)reset(stk[tp--]);
return stk[];
}
il vd rec(int now){
if(!now)return;
rec(Now.ls),rec(Now.rs),stack[++top]=now;
}
int main(){
int n=gi(),m=gi();char opt[];
rep(i,,)stack[-i+]=i;
top=;
srand();
rep(i,,)t[i].rand=i;
rep(i,,)swap(t[rand()%+].rand,t[rand()%+].rand);
root=build(n);
rep(i,,m){
scanf("%s",opt);
if(opt[]=='X')printf("%d\n",t[root].maxx);
else if(opt[]=='S'){
pr T=split(root,gi());
root=merge(merge(T.first,build(gi())),T.second);
}else{
pr T=split(root,gi()-),TT=split(T.second,gi());
if(opt[]=='K')t[TT.first].set=,t[TT.first].setnum=gi();
else if(opt[]=='V')t[TT.first].rev^=;
else if(opt[]=='T')printf("%d\n",t[TT.first].sum);
if(opt[]!='L')root=merge(T.first,merge(TT.first,TT.second));
else root=merge(T.first,TT.second),rec(TT.first);
}
}
return ;
}
/*
9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM
INSERT 8 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM
*/
解题报告请看这里
[bzoj1500][luogu2042][cogs339][codevs1758]维修数列(维护数列)的更多相关文章
- 【bzoj1500】 noi2005—维护数列
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 (题目链接) 题意 要求维护数列,操作有区间删除,区间插入,区间反转,区间修改,区间求和,求最 ...
- 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列
339. [NOI2005] 维护数列 时间限制:3 s 内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...
- [NOI2005] 维护数列
[NOI2005] 维护数列 题目 传送门 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格) 操作编号 输入文件中的格式 说明 1 ...
- 【NOI2005】维护数列
https://daniu.luogu.org/problem/show?pid=2042 一道伸展树维护数列的很悲伤的题目,共要维护两个标记和两个数列信息,为了维护MAX-SUM还要维护从左端开始的 ...
- BZOJ1798 AHOI2009 维护数列
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- ☆ [ZJOI2006] 书架 「平衡树维护数列」
题目类型:平衡树 传送门:>Here< 题意:要求维护一个数列,支持:将某个元素置顶或置底,交换某元素与其前驱或后继的位置,查询编号为\(S\)的元素的排名,查询排名第\(k\)的元素编号 ...
- P2042 [NOI2005]维护数列 && Splay区间操作(四)
到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...
- 洛谷 P2042 [NOI2005]维护数列-Splay(插入 删除 修改 翻转 求和 最大的子序列)
因为要讲座,随便写一下,等讲完有时间好好写一篇splay的博客. 先直接上题目然后贴代码,具体讲解都写代码里了. 参考的博客等的链接都贴代码里了,有空再好好写. P2042 [NOI2005]维护数列 ...
- P2042 [NOI2005]维护数列[splay或非旋treap·毒瘤题]
P2042 [NOI2005]维护数列 数列区间和,最大子列和(必须不为空),支持翻转.修改值.插入删除. 练码力的题,很毒瘤.个人因为太菜了,对splay极其生疏,犯了大量错误,在此记录,望以后一定 ...
随机推荐
- 2、Android-UI(RecyclerView)
2.6.滚动控件-RecylerView ListView虽然使用的效果很好但是也是有缺点的 不使用一些技巧来提升它的运行效率,性能就非常差 扩展性也不是很好 只能实现数据的纵向滚动效果 实现横向滚动 ...
- 30、springboot与检索(2)
项目中进行整合: 1.整合 新建项目加入依赖(NoSql) springboot默认使用SpringDate ElasticSearch模块进行操作 查看自动配置类: SpringBoot默认支持 ...
- 一般处理程序中,获取session
注意了: 1.要在一般处理程序中获取其他页面的session值,需要引用名空间: using System.Web.SessionState; 2.然后继承一个接口:IRequiresSessionS ...
- angularjs ng-if ng-show ng-hide区别
在使用anularjs开发前端页面时,常常使用ng-show.ng-hide.ng-if功能来控制页面元素的显示或隐藏,那他们之间有什么不同呢? 实现原理方面:ng-show/ng-hide是通过修改 ...
- 在hyper-v中安装centos后配置网络
/etc/sysconfig/network-scripts vi ifcfg-eth0 改为以下配置 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no ...
- Python 基于request库的get,post,delete,封装
# coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...
- Loj_6282. 数列分块入门 6
Loj_6282 这个题目涉及到了块的重构,这里使用了\(\sqrt{n}\)次插入便重构的方法 讲重复的操作提出来做了函数 #include <iostream> #include &l ...
- python -- peewee处理数据库连接
目前,实现了的Database子类有三个:SqliteDatabase.MySQLDatabase.PostgresqlDatabase class SqliteDatabase(Database) ...
- HDU 1599 find the mincost route(floyd求最小环 无向图)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS ...
- 软工之404 Note Found团队
如果记忆是一个罐头的话,我希望这一罐罐头不会过期----<重庆森林> 404 Note Found Team 如果记忆是一个备忘录的话,别说了,它不会过期----<404 Note ...