思路

超级恶心的pushdown

昏天黑地的调

让我想起了我那前几个月的线段树2

错误

这恶心的一道题终于过了

太多错误,简直说不过来

pushup

pushdown

主要就是这俩不太清晰,乱pushdown

其他的写的还没啥毛病(能看出来)

代码

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
#include <algorithm>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=5e5+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
int read() {
int x=0,f=1;char s=getchar();
for(; s>'9'||s<'0'; s=getchar()) if(s=='-') f=-1;
for(; s>='0'&&s<='9'; s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,rt,cnt;
int init[maxn];
stack<int> q;//回收废弃数组
struct node
{
int ch[2],val,pri,size;
int sum,ma,lma,rma;
int lazy_fanzhuan,lazy_chenzhen;
void clear()
{
ch[1]=ch[2]=val=pri=size=sum=lazy_fanzhuan=lma=rma=0;
ma=-inf;
lazy_chenzhen=inf;
}
void iit(int x)
{
ma=sum=val=init[x];
lma=rma=max(init[x],0);
size=1;
pri=x;
}
}e[maxn];
void pushup(int a)
{
int ls=e[a].ch[0],rs=e[a].ch[1];
//sum
e[a].sum=e[ls].sum+e[rs].sum+e[a].val;
//size
e[a].size=e[ls].size+e[rs].size+1;
//ma
e[a].ma=max(max(e[ls].ma,e[rs].ma),e[ls].rma+e[a].val+e[rs].lma);
//lma
e[a].lma=max(e[ls].lma,e[ls].sum+e[a].val+e[rs].lma);
//rma
e[a].rma=max(e[rs].rma,e[rs].sum+e[a].val+e[ls].rma); }
void down_1(int a,int ad)
{
//@修改自身
e[a].lazy_chenzhen=ad;
e[a].val=e[a].lazy_chenzhen;
e[a].sum=e[a].size*e[a].val;
e[a].ma=max(e[a].sum , e[a].val);
e[a].lma=e[a].rma=max(e[a].sum , 0);
}
void down_2(int a)
{
//sum和ma是不变的
swap(e[a].lma,e[a].rma);
swap(e[a].ch[0],e[a].ch[1]);
e[a].lazy_fanzhuan^=1;
}
void pushdown(int a)
{
if(!a) return;
int ls=e[a].ch[0],rs=e[a].ch[1];
if(e[a].lazy_fanzhuan)
{
//sum和ma是不变的
if(ls) down_2(ls);
if(rs) down_2(rs);
}
if(e[a].lazy_chenzhen!=inf)
{
if(ls) down_1(ls,e[a].lazy_chenzhen);
if(rs) down_1(rs,e[a].lazy_chenzhen);
}
e[a].lazy_chenzhen=inf;
e[a].lazy_fanzhuan=0;
}
int merge(int x,int y)
{
pushdown(x),pushdown(y);
if(!x || !y) return x+y;
if(e[x].pri<e[y].pri)
{
e[x].ch[1]=merge(e[x].ch[1],y);
pushup(x);return x;
} else
{
e[y].ch[0]=merge(x,e[y].ch[0]);
pushup(y);return y;
}
}
void split(int now,int k,int &x,int &y)
{
if(!now) x=y=0,e[now].clear();
else
{
pushdown(now);
if(e[e[now].ch[0]].size+1<=k)
x=now,split(e[now].ch[1],k-e[e[now].ch[0]].size-1,e[x].ch[1],y);
else
y=now,split(e[now].ch[0],k,x,e[y].ch[0]);
pushup(now);
}
}
int GET()
{
if(!q.empty())
{
int tmp=q.top();
q.pop();
return tmp;
} else
return ++cnt;
}
int build(int l,int r)
{
if(l>r) return 0;
int mid=(l+r)>>1,p=GET();
e[p].clear();
e[p].iit(mid);
e[p].ch[0]=build(l,mid-1);
e[p].ch[1]=build(mid+1,r);
pushup(p);
return p;
}
void dfs(int now)
{
if(!now) return;
dfs(e[now].ch[0]);
q.push(now);
dfs(e[now].ch[1]);
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
n=read(),m=read();
FOR(i,1,n) init[i]=read();
rt=build(1,n);
FOR(i,1,m)
{
string s;
cin>>s;
if(s=="INSERT")
{ // 插入
int id=read(),gs=read(),x,y,z;
FOR(j,1,gs) init[j]=read();
y=build(1,gs);
split(rt,id,x,z);
rt=merge(merge(x,y),z);
} else
if(s=="DELETE")
{
int id=read()-1,gs=read(),x,y,z;
split(rt,id,x,z);
split(z,gs,y,z);
dfs(y);
rt=merge(x,z);
} else
if(s=="MAKE-SAME")
{
int id=read()-1,gs=read(),ad=read(),x,y,z;
split(rt,id,x,z);
split(z,gs,y,z);
down_1(y,ad);
rt=merge(merge(x,y),z);
} else
if(s=="REVERSE")
{
int id=read()-1,gs=read(),x,y,z;
split(rt,id,x,z);
split(z,gs,y,z);
down_2(y);
rt=merge(merge(x,y),z);
} else
if(s=="GET-SUM")
{
int id=read()-1,gs=read(),x,y,z;
split(rt,id,x,z);
split(z,gs,y,z);
cout<<e[y].sum<<"\n";
rt=merge(merge(x,y),z);
} else
if(s=="MAX-SUM")
{ //询问
cout<<e[rt].ma<<"\n";
}
}
return 0;
}

P2042 [NOI2005]维护数列的更多相关文章

  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. Luogu P2042 [NOI2005]维护数列(平衡树)

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

  5. Luogu P2042 [NOI2005]维护数列

    题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线' _ '表示实际输入文件中的空格) 输入输出格式 输入格式: 输入文件的第 1 行包含两个数 N 和 M, ...

  6. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.net/suncongbo/article/details/82027387 题目链接: (l ...

  7. 洛谷P2042 [NOI2005]维护数列

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

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

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

  9. [NOI2005] 维护数列

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

随机推荐

  1. MYSQLi数据访问查询数据

    单条件查询 <body> <div align="center" style="width:90%;"> <h1>数据查询& ...

  2. eclipse安装Freemaker IDE插件

    eclipse安装Freemaker IDE插件 http://download.jboss.org/jbosstools/updates/

  3. CentOS下nginx+php的配置及nginx开机启动配置

    关闭防火墙 (不然外链接是访问不了 apache) service iptables stop 关闭安全系统 SELinux( 不然报403 访问页面错误 ) 1.Nginx安装主要在于配置文件的修改 ...

  4. php-fpm慢日志配置

    upstream timed out (110: Connection timed out) while reading response header from upstream Nginx报错日志 ...

  5. 【Hadoop学习之八】MapReduce开发

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 伪分布式:HDFS和YARN 伪分 ...

  6. Set接口——LinkedHashSet集合

    底层是由哈希表+链表:

  7. java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况

    java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况 邮件短信微服务 spring boot 微服务 接收json格式参数 验证参数合 ...

  8. How to use CAR FANS C800 Diagnostic Scan Tool to do diagnosis operation

    How to use Heavy Duty Diagnostic CAR FANS C800 Diagnostic Scan Tool to do diagnosis operation Here i ...

  9. zabbix实现电话、短信、邮件报警

    该报警方式提前说明:(1)该方式可以实现zabbix免费电话报警以及微信.短信.邮件报警,但有数量限制.详见如下:如数量不能满足需要以及人员需要,可以考虑购买收费版.(2)毕竟是免费版,电话通知要省着 ...

  10. Charles 从入门到精通 --转

    文章目录 1. 目录及更新说明 2. Charles 限时优惠 3. 简介 4. 安装 Charles 5. 将 Charles 设置成系统代理 6. Charles 主界面介绍 7. 过滤网络请求 ...