BZOJ_1500_[NOI2005]维修数列_splay
BZOJ_1500_[NOI2005]维修数列_splay
题意:
分析:
节点维护从左开始的最大连续子段和,从右开始的最大连续子段和,区间的最大连续子段和
插入:重新建一棵树,把pos旋到根,把pos+1旋到根的右儿子,直接插到根的右儿子的左儿子上
删除:节点回收,用循环队列或者栈存一下删除的节点,新建的时候用。
修改和翻转正常做,这两个标记互不影响。记得翻转时左右儿子的信息都要交换。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1000050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (x==ch[f[x]][1])
int ch[N][2],f[N],siz[N],val[N],n,m;
int cov[N],turn[N],maxl[N],maxr[N],maxm[N];
int S[N],top,sum[N],rt,a[N],sz,tot;
int other_root;
char opt[20];
void clear(int x){if(!x)return ;ch[x][0]=ch[x][1]=f[x]=val[x]=siz[x]=sum[x]=turn[x]=maxl[x]=maxr[x]=maxm[x]=0;cov[x]=0x3f3f3f3f;}
void print(int p)
{
if(!p)return ;
if(ls)print(ls);
printf("p=%d val[p]=%d\n",p,val[p]);
if(rs)print(rs);
}
int newnode(int v)
{
int p;
if(top)p=S[--top];
else p=++tot;
clear(p);
val[p]=v;siz[p]=1;
maxl[p]=maxr[p]=v>0?v:0;
maxm[p]=v;
return p;
}
void update(int p)
{
if(!p)return ;
siz[p]=siz[ls]+siz[rs]+1;
sum[p]=sum[ls]+sum[rs]+val[p];
maxl[p]=max(maxl[ls],sum[ls]+val[p]+maxl[rs]);
maxr[p]=max(maxr[rs],sum[rs]+val[p]+maxr[ls]);
maxm[p]=val[p];
maxm[p]=max(max(maxm[p],maxm[ls]),maxm[rs]);
maxm[p]=max(maxm[p],maxr[ls]+val[p]+maxl[rs]);
}
void pushdown(int p)
{
if(cov[p]!=0x3f3f3f3f)
{
int t=cov[p];
cov[p]=0x3f3f3f3f;
cov[ls]=cov[rs]=t;
val[ls]=val[rs]=t;
sum[ls]=siz[ls]*t;
sum[rs]=siz[rs]*t;
maxl[ls]=maxr[ls]=t>0?sum[ls]:0;
maxm[ls]=t>0?sum[ls]:t;
maxl[rs]=maxr[rs]=t>0?sum[rs]:0;
maxm[rs]=t>0?sum[rs]:t;
}
if(turn[p])
{
swap(ls,rs);
swap(maxl[ls],maxr[ls]);
swap(maxl[rs],maxr[rs]);
turn[ls]^=1;
turn[rs]^=1;
turn[p]=0;
}
}
void rotate(int x)
{
int y=f[x],z=f[y],k=get(x);
ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;
ch[x][k^1]=y;f[y]=x;f[x]=z;
if(z) ch[z][ch[z][1]==y]=x;
update(y),update(x);
if(rt==y)rt=x;
}
void splay(int x,int y)
{
for(int fa;(fa=f[x])!=y;rotate(x))
if(f[fa]!=y)
rotate((get(x)==get(fa)) ? fa : x);
}
int find(int x)
{
int p=rt;
while(1)
{
pushdown(p);
if(x<=siz[ls])p=ls;
else
{
x-=siz[ls]+1;
if(!x) return p;
p=rs;
}
}
}
void print1()
{
for(int i=1;i<=sz;i++){int p=find(i);printf("p=%d val[p]=%d\n",p,val[p]);}
}
void build(int fa,int l,int r)
{
if(l>r)return ;
int mid=l+r>>1;
ch[fa][mid>fa]=mid;
f[mid]=fa;
val[mid]=a[mid-1];
siz[mid]=1;
build(mid,l,mid-1);
build(mid,mid+1,r);
update(mid);
}
void build_merge(int fa,int l,int r,int flg)
{
if(l>r)return ;
int mid=l+r>>1;
int p=newnode(a[mid]);
val[p]=a[mid];
ch[fa][flg]=p;
f[p]=fa;
build_merge(p,l,mid-1,0);
build_merge(p,mid+1,r,1);
update(p);
}
void insert(int x,int cnt)
{
int i;
for(i=1;i<=cnt;i++) scanf("%d",&a[i]);
sz+=cnt;
int p=x+1;
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
build_merge(p,1,cnt,0);
}
void rec(int p)
{
if(!p)return ;
if(ls)rec(ls);
ls=0;
if(rs)rec(rs);
rs=0;
clear(p);
S[top++]=p;
}
void del(int x,int p)
{
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
sz-=siz[ls];
rec(ls);
ls=0;
update(p);update(x);
}
void modify(int x,int p,int c)
{
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
cov[ls]=c;
val[ls]=c;
sum[ls]=c*siz[ls];
maxl[ls]=maxr[ls]=c>0?sum[ls]:0;
maxm[ls]=c>0?sum[ls]:c;
update(p);update(x);
}
void reverse(int x,int p)
{
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
turn[ls]^=1;
swap(maxl[ls],maxr[ls]);
update(p);update(x);
}
void getsum(int x,int p)
{
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
printf("%d\n",sum[ls]);
}
void getmax_sum()
{
int x=1,p=sz;
x=find(x);
p=find(p);
splay(x,f[rt]);
splay(p,rt);
printf("%d\n",maxm[ls]);
}
int main()
{
scanf("%d%d",&n,&m);
memset(cov,0x3f,sizeof(cov));
sz=n+2;tot=n+2;
int i,x,y,z;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
build(0,1,n+2);
rt=n+3>>1;
for(i=1;i<=m;i++)
{
scanf("%s",opt);
if(opt[2]=='S'){
scanf("%d%d",&x,&y);
insert(x+1,y);
}else if(opt[2]=='L'){
scanf("%d%d",&x,&y);
del(x,x+y+1);
}else if(opt[2]=='K'){
scanf("%d%d%d",&x,&y,&z);
modify(x,x+y+1,z);
}else if(opt[2]=='V'){
scanf("%d%d",&x,&y);
reverse(x,x+y+1);
}else if(opt[2]=='T'){
scanf("%d%d",&x,&y);
getsum(x,x+y+1);
}else{
getmax_sum();
}
}
}
BZOJ_1500_[NOI2005]维修数列_splay的更多相关文章
- [NOI2005] 维修数列
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 8397 Solved: 2530 Description In ...
- bzoj 1500: [NOI2005]维修数列 splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 6556 Solved: 1963[Submit][Status ...
- [BZOJ1500][NOI2005]维修数列---解题报告
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]维修数列 解题报告 Splay
Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...
- BZOJ 1500: [NOI2005]维修数列 (splay tree)
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 4229 Solved: 1283[Submit][Status ...
- 【BZOJ1500】[NOI2005]维修数列 Splay
[BZOJ1500][NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行 ...
- [bzoj1500][NOI2005]维修数列_非旋转Treap
维修数列 bzoj-1500 NOI-2005 题目大意:给定n个数,m个操作,支持:在指定位置插入一段数:删除一个数:区间修改:区间翻转.查询:区间和:全局最大子序列. 注释:$1\le n_{ma ...
- 【BZOJ】1500: [NOI2005]维修数列
[算法]splay [题解]数据结构 感谢Occult的模板>_<:HYSBZ 1500 维修数列 #include<cstdio> #include<cctype> ...
随机推荐
- JVM terminated. Exit code=8096
http://www-01.ibm.com/support/docview.wss?uid=swg21303648 Technote (troubleshooting) Problem(Abstrac ...
- Python-网站页面代码获取
Python3.6 库:urllib3, bs4 主程序是抓取亚马逊图书销售排名数据,但是亚马逊应该是加了反爬虫,拒绝疑似机器人的请求,这部分暂时以百度代替. 其实简单的页面抓取,常用的urllib. ...
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)
写在前面 最近有这么一个需求,分享页面,分享的是web订单截图,既然是web 就会有超出屏幕的部分, 生成的图片还要加上我们的二维码,这就涉及到图片的合成了. 有了这样的需求,就是各种google.也 ...
- 时间复杂度O(n),空间复杂度O(1)解斐波那契数列
#include <stdio.h> #include <iostream> using namespace std; long long fibs1(int in_iN) { ...
- jieba库分词
(1)团队简介的词频统计 import jieba import collections s="制作一个购票小程序,这个购票小程序可以根据客户曾经的购票历史" s+="和 ...
- 洛谷 P2587 解题报告
P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...
- 洛谷 P1057 解题报告
P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...
- 通过jstack与jmap分析一次cpu打满的线上故障
一.发现问题 下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复. 二.排查思路 简单分析下可能出问题 ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...