[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极其生疏,犯了大量错误,在此记录,望以后一定 ...
随机推荐
- 「LGP4719【模板】动态dp」
题目 尽管知道这个东西应该不会考了,但是还是学一学吧 哎要是去年noip之前学该多好 动态\(dp\)就是允许修改的一个\(dp\),比如这道题,我们都知道这是一个树上最大点权独立集 众所周知方程长这 ...
- 【[LNOI2014]LCA】
这题好神啊 能够\(1A\)真是不可思议 首先看到要求的这个柿子\(\sum_{i=l}^{r}deep[LCA(i,z)]\),而且\(l\)和\(r\)并不是来自与一棵子树或者一条链,而是编号连续 ...
- POJ1039 Pipe
嘟嘟嘟 大致题意:按顺序给出\(n\)个拐点表示一个管道,注意这些点是管道的上端点,下端点是对应的\((x_i, y_i - 1)\).从管道口射进一束光,问能达到最远的位置的横坐标.若穿过管道,输出 ...
- 使用navigator.userAgent来进行浏览器嗅探
/*--------------------------------------------------------------------------------* * 功能描述:使用navigat ...
- 获取 当前显示的 UIViewController
UIViewController * findBestVC(UIViewController *vc) { if (vc.presentedViewController) { return findB ...
- 2018 HNUCM ACM集训队选拔第一场
1.小c的倍数问题 http://acm.hdu.edu.cn/showproblem.php?pid=6108 分析: 比赛的时候真的是各种想,结果发现自己是想多了...数论基础差得一批 求有多少个 ...
- stm32 晶振不起振
1. STM32f103有内部晶振.刚刚上电时,所有Clock都是源于内部晶振,所以当片内没有程序或内部程序没有使能外部晶振时,外部晶振是不会起振的.2. STM32f103有内部复位电路,只有当检测 ...
- 由使用request-promise-native想到的异步处理方法
由使用request-promise-native想到的异步处理方法 问题场景 因为js语言的特性,使用node开发程序的时候经常会遇到异步处理的问题.对于之前专长App开发的我来说,会纠结node中 ...
- JavaScript中的this详解(彻底弄懂js中的this用法)!
要想学好js,那么其中那些特别令人混淆迷惑的知识点,就一定要弄清楚.this关键字就是其中让初学者比较迷惑的知识点之一,不过灵活运用this可以提升代码的性能和复用性,那么今天我就和大家一起来了解th ...
- cannot find module 'xxx' 解决办法
先将node_module文件夹删掉 工程目录下输入命令:npm clean cache 查看package.json里有没有依赖项,有的话npm install 没有就npm install exp ...