BZ链接

洛谷链接

这道题真是丧心病狂。。。。

应该很容易就可以看出做法,但是写代码写的.......

思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节

首先如果按照常规写法的话,splay的节点要开到4000000,

直接炸飞,

由于任意时刻splay中的节点最多只有500000个,我们只需要开500000个节点就好了

然后将没有用的节点回收起来,下一次插入是插入到这些节点中

然后就是插入是将要插入的所有数字build成一颗平衡树,直接接在要插入的位置,这样会快很多

维护最大子段和与线段树维护最大子段和方法一样,维护以包含左端点且以左端点开头的最大字段和,以及以右端点结尾的最大字段和

还有自身的最大子段和,然后就可以通过左右儿子的信息快速算出当前节点的信息了

具体细节可以看代码

# include<cstdio>
# include<iostream>
# include<cmath>
# include<algorithm>
# include<cstring>
# include<queue>
using namespace std;
const int inf = 0xfffffff;
const int mn = ;
int n,m,a[mn];
struct Splay
{
int son[mn][],fa[mn],sum[mn],id[mn],siz[mn];
int v[mn],mx[mn],lx[mn],rx[mn],root,cnt;
bool rev[mn],tag[mn];
//v[x]为自身的权值
//rev为翻转标记,sum为和,mx为最大子段和
queue<int> q;
//记录无用的编号
void updown(int x)
{
int l=son[x][],r=son[x][];
sum[x]=sum[l]+sum[r]+v[x];
siz[x]=siz[l]+siz[r]+;
mx[x]=max(mx[l],max(mx[r],rx[l]+v[x]+lx[r]));
lx[x]=max(lx[l],sum[l]+lx[r]+v[x]);
rx[x]=max(rx[r],sum[r]+rx[l]+v[x]);
}
void pushdown(int x)
{
int l=son[x][],r=son[x][];
if(tag[x])
{
tag[x]=rev[x]=;
if(l) tag[l]=,v[l]=v[x],sum[l]=v[x]*siz[l];
if(r) tag[r]=,v[r]=v[x],sum[r]=v[x]*siz[r];
if(v[x]>=)
{
if(l) mx[l]=lx[l]=rx[l]=sum[l];
if(r) mx[r]=lx[r]=rx[r]=sum[r];
}
else
{
if(l) mx[l]=v[x],lx[l]=rx[l]=;
if(r) mx[r]=v[x],lx[r]=rx[r]=;
}
}
if(rev[x])
{
rev[x]=;
rev[l]^=;
rev[r]^=;
swap(lx[l],rx[l]);
swap(rx[r],lx[r]);
swap(son[l][],son[l][]);
swap(son[r][],son[r][]);
}
}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y];
int tmp;
if(son[y][]==x) tmp=;
else tmp=;
if(k==y)
k=x;
else
{
if(son[z][]==y) son[z][]=x;
else son[z][]=x;
}
son[y][tmp^]=son[x][tmp],fa[son[y][tmp^]]=y;
son[x][tmp]=y;
fa[y]=x,fa[x]=z;
updown(y),updown(x);
}
void splay(int x,int &k)
{
while(x!=k)
{
int y=fa[x],z=fa[y];
if(y!=k)
{
if((son[z][]==y) ^ (son[y][]==x))
rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int find(int x,int rk)
{
pushdown(x);
int l=son[x][],r=son[x][];
if(siz[l]+==rk) return x;
else if(siz[l]>=rk) return find(l,rk);
else return find(r,rk-siz[l]-);
}
int split(int k,int tot)
{
int x=find(root,k),y=find(root,k+tot+);
//printf("QWQ\n");
splay(x,root),splay(y,son[x][]);
//printf("QWQ\n");
return son[y][];
}
void recyc(int x)
{
int &l=son[x][],&r=son[x][];
if(l) recyc(l);
if(r) recyc(r);
q.push(x);
fa[x]=l=r=tag[x]=rev[x]=;
}
void update()
{
int k,tot,val;
scanf("%d%d%d",&k,&tot,&val);
int x=split(k,tot),y=fa[x];
v[x]=val;
tag[x]=;
sum[x]=siz[x]*val;
if(val>=) lx[x]=rx[x]=mx[x]=sum[x];
else lx[x]=rx[x]=,mx[x]=v[x];
updown(y);
updown(fa[y]);
}
void rever()
{
int k,tot;
scanf("%d%d",&k,&tot);
int x=split(k,tot),y=fa[x];
if(!tag[x])
{
rev[x]^=;
swap(lx[x],rx[x]);
swap(son[x][],son[x][]);
updown(y);
updown(fa[y]);
}
}
void build(int l,int r,int f)
{
int mid=(l+r)>>,now=id[mid],pre=id[f];
if(l==r)
{
mx[now]=sum[now]=a[l];
tag[now]=rev[now]=;
lx[now]=rx[now]=max(a[l],);
siz[now]=;
}
if(l<mid) build(l,mid-,mid);
if(r>mid) build(mid+,r,mid);
v[now]=a[mid];
fa[now]=pre;
updown(now);
son[pre][(mid>=f)]=now;
}
void ins()
{
int k,tot;
scanf("%d%d",&k,&tot);
for(int i=; i<=tot; i++)
scanf("%d",&a[i]);
for(int i=; i<=tot; i++)
if(!q.empty())
{
id[i]=q.front();
q.pop();
}
else id[i]=++cnt;
build(,tot,);//将要加入的数字建一颗splay
int z=id[(+tot)>>];//取根
int x=find(root,k+),y=find(root,k+);
splay(x,root),splay(y,son[x][]);
fa[z]=y;
son[y][]=z;
updown(y),updown(x);
}
void del()
{
int k,tot;
scanf("%d%d",&k,&tot);
int x=split(k,tot);
int y=fa[x];
recyc(x);
son[y][]=;
updown(y),updown(fa[y]);
}
void query()
{
int k,tot;
scanf("%d%d",&k,&tot);
int x=split(k,tot);
//printf("sss\n");
printf("%d\n",sum[x]);
}
} T;
int main()
{
int x,y;
char opt[];
scanf("%d%d",&n,&m);
T.mx[]=a[]=a[n+]=-inf;
for(int i=; i<=n; i++)
scanf("%d",&a[i+]);
for(int i=; i<=n+; i++)
T.id[i]=i;
T.cnt=n+;
T.build(,n+,);
T.root=(n+)>>;
for(int i=; i<=m; i++)
{
scanf("%s",opt);
if(opt[]=='I') T.ins();
else if(opt[]=='D') T.del();
else if(opt[]=='M' && opt[]=='K') T.update();
else if(opt[]=='R') T.rever();
else if(opt[]=='G') T.query();
else printf("%d\n",T.mx[T.root]);
}
return ;
}

BZOJ 1500 洛谷2042维护序列题解的更多相关文章

  1. 洛谷 P2023 维护序列 题解

    题面 注意一个细节,查询和更新都需要pushdown(); #include <bits/stdc++.h> #define int long long using namespace s ...

  2. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  3. 洛谷 P2023 维护序列——线段树

    先上一波题目 https://www.luogu.org/problem/P2023 复习了一波线段树 题目涉及的操作有区间加 区间乘以及区间求和 tips:线段树在传标记的时候 优先传乘法标记再传加 ...

  4. BZOJ 4034 洛谷3178 树上操作题解

    一个很裸的树链剖分模板.注意一下数据范围,有的地方要开longlong,这就是唯一的陷阱了. # include<iostream> # include<cstdio> # i ...

  5. 洛谷 P1628 合并序列

    洛谷 P1628 合并序列 题目传送门 题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100 ...

  6. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  7. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  8. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  9. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

随机推荐

  1. 关于SQL查询效率 主要针对sql server

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比 ...

  2. finger 工具:用来查询用户信息,侧重用户家目录、登录SHELL等

    finger 工具侧重于用户信息的查询:查询的内容包括用户名(也被称为登录名Login),家目录,用户真实的名字(Name)... ... 办公地址.办公电话:也包括登录终端.写状态.空闭时间等: 我 ...

  3. HDU 5266 pog loves szh III 线段树,lca

    Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of ...

  4. 通过游戏学python 3.6 第一季 第四章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释 可复制直接使用 娱乐 可封装 函数

    #猜数字--核心代码--猜测次数--随机函数和屏蔽错误代码---优化代码及注释 #!usr/bin/env python #-*-coding:utf-8-*- #QQ124111294 import ...

  5. ios那些事之如何在ios5上运行gdb

    为啥要在ios上运行gdb? 这个问题见仁见智喽.对于搞开发的同学们来所, 有了gdb更方便跟踪分析别人的程序,取长补短:)这里不是教大家crack:) 运行环境: Mac OS 10.7.4 Xco ...

  6. 磁力搜索网站 BT torrent search engine 推荐 2019/12/25日更新

    btkitty 知名的BT磁力搜索,资源很多,中文友好 btdb 知名的BT磁力搜索,资源很多,中文友好 838888 不错的 BT 磁力搜索引擎,资源很多,中文友好 idope.se 资源丰富的BT ...

  7. Python服务端工程师就业面试指导

    Python服务端工程师就业面试指导 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候 ...

  8. linux学习 网络系统&文件查找

    被用来配置和操作网络系统的命令数目非常巨大,这里仅仅介绍一些经常会使用的 这一章会介绍ssh远程登录程序哦 ping 命令(掠过) traceroute 会显示主机到指定的主机要经过的跳数的网络流量列 ...

  9. dom4解析 XML

    Java XML解析工具 dom4j介绍及使用实例 Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projec ...

  10. TSQL:让监控分析更简单更高效

    1. 前言 阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数.用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析. 2. 为什么需 ...