[NOI2005]维护数列(luogu)

打这玩意儿真是要了我的老命

Description

请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格)

Code

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define TAGNONE 10000001
using namespace std;
const int N=1e6+;
struct node
{
int size,rev,ch[],res,prer,prel,tag,fa,sum,val;
void clear()
{
size=rev=ch[]=ch[]=res=prer=prel=fa=sum=val=;
tag=TAGNONE;
}
}f[N];
int x,id[N],tot,n,ru[N],rt,pos,len,d[N],m,cnt;
char s[];
int get()
{
if(tot==) return ++cnt;
int x=ru[tot--];
return x;
}
void c_val(int x,int y)
{
if(!x) return ;
f[x].tag=f[x].val=y;
f[x].sum=y*f[x].size;
f[x].prel=f[x].prer=max(,f[x].sum);
f[x].res=max(y,f[x].sum);
}
void c_rev(int x)
{
swap(f[x].ch[],f[x].ch[]);
swap(f[x].prer,f[x].prel);
f[x].rev^=;
}
void push_up(int x)
{
int lc=f[x].ch[],rc=f[x].ch[];
f[x].size=f[lc].size+f[rc].size+;
f[x].sum=f[lc].sum+f[rc].sum+f[x].val;
f[x].res=max(max(f[lc].res,f[rc].res),f[lc].prer+f[rc].prel+f[x].val);
f[x].prel=max(f[lc].prel,f[lc].sum+f[rc].prel+f[x].val);
f[x].prer=max(f[rc].prer,f[rc].sum+f[lc].prer+f[x].val);
}
void push_down(int x)
{
int lc=f[x].ch[],rc=f[x].ch[];
if(f[x].tag!=TAGNONE)
{
c_val(lc,f[x].tag);
c_val(rc,f[x].tag);
f[x].tag=TAGNONE;
}
if(f[x].rev)
{
c_rev(lc),c_rev(rc);
f[x].rev=;
}
}
int kth(int k)
{
int x=rt;
while()
{
push_down(x);
int lc=f[x].ch[],rc=f[x].ch[];
if(f[lc].size+==k) return x;
else if(f[lc].size>=k) x=lc;
else k-=f[lc].size+,x=rc;
}
}
void rotate(int x)
{
int y=f[x].fa,z=f[y].fa;
int wh=(x==f[y].ch[]);
f[f[x].ch[wh^]].fa=y;
f[y].ch[wh]=f[x].ch[wh^];
f[x].ch[wh^]=y;
f[y].fa=x,f[x].fa=z;
if(z) f[z].ch[y==f[z].ch[]]=x;
push_up(y),push_up(x);
}
void splay(int x,int y)
{
for(int fx=f[x].fa;fx=f[x].fa,fx!=y;rotate(x))
if(f[fx].fa!=y) rotate((fx==f[f[fx].fa].ch[])^(x==f[fx].ch[])?x:fx);
if(!y) rt=x;
}
int split(int pos,int len)
{
int x=kth(pos),y=kth(pos+len+);
splay(x,),splay(y,x);
return f[y].ch[];
}
void creat(int x,int y)
{
f[x].val=f[x].sum=f[x].res=y;
f[x].prel=f[x].prer=max(y,);
f[x].rev=,f[x].tag=TAGNONE;
f[x].size=;
}
void build(int l,int r,int fa)
{
int mid=(l+r)>>;
int x=id[mid],fx=id[fa];
if(l==r) creat(x,d[mid]);
if(l<mid) build(l,mid-,mid);
if(mid<r) build(mid+,r,mid);
f[x].tag=TAGNONE,f[x].val=d[mid],f[x].fa=fx;
push_up(x);
f[fx].ch[mid>=fa]=x;
}
void insert(int x,int len)
{
for(int i=;i<=len;i++)
scanf("%d",&d[i]),id[i]=get();
build(,len,);
int a=kth(x+),b=kth(x+);
splay(a,),splay(b,a);
int c=id[(+len)>>];
f[c].fa=b,f[b].ch[]=c;
push_up(b),push_up(a);
}
void remove(int x)
{
if(f[x].ch[]) remove(f[x].ch[]);
if(f[x].ch[]) remove(f[x].ch[]);
ru[++tot]=x,f[x].clear();
}
void eraser(int k,int len)
{
int x=split(k,len),y=f[x].fa;
remove(x);
f[y].ch[]=;
push_up(y),push_up(f[y].fa);
}
void update(int pos,int len,int k)
{
int x=split(pos,len);
c_val(x,k);
push_up(f[x].fa),push_up(rt);
}
void rever(int pos,int len)
{
int x=split(pos,len);
if(f[x].tag!=TAGNONE) return;
c_rev(x);
push_up(f[x].fa),push_up(rt);
}
void query(int pos,int len)
{
int x=split(pos,len);
printf("%d\n",f[x].sum);
}
int main()
{
scanf("%d%d",&n,&m);
f[].res=d[]=d[n+]=-<<;
for(int i=;i<=n;i++) scanf("%d",&d[i+]);
for(int i=;i<=n+;i++) id[i]=i;
build(,n+,);
rt=(n+)>>,cnt=n+;
while(m--)
{
scanf("%s",s);
if(s[]=='M' && s[]=='A' && s[]=='X') printf("%d\n",f[rt].res);
else scanf("%d%d",&pos,&len);
if(s[]=='I') insert(pos,len);
if(s[]=='D') eraser(pos,len);
if(s[]=='M' && s[]=='A' && s[]=='K')
scanf("%d",&x),update(pos,len,x);
if(s[]=='R') rever(pos,len);
if(s[]=='G') query(pos,len);
}
return ;
}

[NOI2005]维护数列(区间splay)的更多相关文章

  1. P2042 [NOI2005]维护数列 && Splay区间操作(四)

    到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...

  2. 洛谷 P2042 [NOI2005]维护数列-Splay(插入 删除 修改 翻转 求和 最大的子序列)

    因为要讲座,随便写一下,等讲完有时间好好写一篇splay的博客. 先直接上题目然后贴代码,具体讲解都写代码里了. 参考的博客等的链接都贴代码里了,有空再好好写. P2042 [NOI2005]维护数列 ...

  3. P2042 [NOI2005]维护数列[splay或非旋treap·毒瘤题]

    P2042 [NOI2005]维护数列 数列区间和,最大子列和(必须不为空),支持翻转.修改值.插入删除. 练码力的题,很毒瘤.个人因为太菜了,对splay极其生疏,犯了大量错误,在此记录,望以后一定 ...

  4. 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列

    339. [NOI2005] 维护数列 时间限制:3 s   内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...

  5. [NOI2005] 维护数列

    [NOI2005] 维护数列 题目 传送门 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格) 操作编号 输入文件中的格式 说明 1 ...

  6. Luogu P2042 [NOI2005]维护数列(平衡树)

    P2042 [NOI2005]维护数列 题意 题目描述 请写一个程序,要求维护一个数列,支持以下\(6\)种操作:(请注意,格式栏中的下划线'_'表示实际输入文件中的空格) 输入输出格式 输入格式: ...

  7. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  8. [您有新的未分配科技点] 无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MB Description Input 输入的第1 行包含两个数N 和M(M ≤20 ...

  9. 【bzoj1500】 noi2005—维护数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 (题目链接) 题意 要求维护数列,操作有区间删除,区间插入,区间反转,区间修改,区间求和,求最 ...

随机推荐

  1. quartz关闭DBUG日志

    引用了Quartz组件后,打印日志时,整天都有相应的调试信息打印出来,严重影响了查找日志效率,谷歌一番后,修改nlog配置文件即可 <?xml version="1.0" e ...

  2. 有限状态机FSM和层次状态机HSM

    前言 就单片机而言,程序可以分为两类:带操作系统的程序和前后台程序:前后台程序从架构上又分为顺序机和状态机. 广义地说, 任何一个程序都是一个状态机, 因为它总是要记住一些状态, 然后根据输入进行输出 ...

  3. github 项目搜索技巧-让你更高效精准地搜索项目

    目录 github 搜索技巧 案例 普通搜 搭配技巧搜 限定词 查找某个用户或组织的项目 辅助限定词 还没搞懂的(关于 forks.mirror.issues) 排序(放的是官网的链接) 使用指南 练 ...

  4. 用Tasker实现收到Android手机短信自动转发到邮箱

    发送短信到邮箱的原理与 <用Tasker实现收到Android手机短信自动转发到邮箱>有些类似.  发送短信到邮箱是利用Ifttt这个服务将短信转发到邮箱中.Ifttt服务的可扩展性很强, ...

  5. monorepo仓库管理方式探秘

    前言 随着功能和业务量级的飙升,前端代码量级也越来越大,管理运维的成本也进一步增加. 代码仓库的运营管理挑战也浮出水面. 主流方案有两种:一是multirepo式的分散式的独立仓库,二是monorep ...

  6. DEVOPS技术实践_17:Jenkins使用扩展邮件功能发送邮件

    一 环境准备 1.1 安装插件Email Extension 系统管理-管理插件-安装Email Extension插件 1.2 配置 配置jenkins邮箱的全局配置:系统管理-系统设置-完成邮箱配 ...

  7. Linux Centos7 环境基于Docker部署Zookeeper服务搭建实战

    配置Zookeeper安装目录 在宿主机配置zookeeper安装目录:/docker/develop/zookeeper 并且在文件夹创建 data 和logs 目录: mkdir -p /dock ...

  8. 20191010-4 alpha week 1/2 Scrum立会报告+燃尽图02

    此作业链接参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/8747 2019小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王 ...

  9. 洛谷$P1527$ [国家集训队]矩阵乘法 整体二分

    正解:整体二分 解题报告: 传送门$QwQ$ 阿看到这种查询若干次第$k$小显然就想到整体二分$QwQ$? 然后现在就只要考虑怎么快速求出一个矩形内所有小于某个数的数的个数? 开始我的想法是离散化然后 ...

  10. Django 项目目录重构

    原因 一个完整的项目下来, 会涉及很多模块, 文件和资源, 对Django默认的文件目录结构基础上进行重构, 会使得我们的项目结构更加清晰, 便于后期管理 重构 """ ...