[BJOI2019]删数(线段树)

题面

洛谷

题解

按照值域我们把每个数的出现次数画成一根根的柱子,然后把柱子向左推导,\([1,n]\)中未被覆盖的区间长度就是答案。

于是问题变成了单点修改值,即修改两根柱子的长度。全体修改就可以理解为询问区间的平移。

那么只需要拿线段树维护这个东西就行了。

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 150150
#define lson (now<<1)
#define rson (now<<1|1)
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,a[MAX];
int t[MAX<<4],cnt[MAX<<4],mn[MAX<<4],tag[MAX<<4],ans[MAX<<4];
void pushup(int now)
{
mn[now]=min(mn[lson],mn[rson]);
cnt[now]=(mn[now]==mn[lson]?cnt[lson]:0)+(mn[now]==mn[rson]?cnt[rson]:0);
ans[now]=ans[lson]+ans[rson];
}
void puttag(int now,int w)
{
mn[now]+=w;tag[now]+=w;ans[now]=(mn[now]==0?cnt[now]:0);
}
void pushdown(int now)
{
if(!tag[now])return;
puttag(lson,tag[now]);
puttag(rson,tag[now]);
tag[now]=0;
}
void Build(int now,int l,int r)
{
if(l==r){cnt[now]=ans[now]=1;return;}
int mid=(l+r)>>1;
Build(lson,l,mid);Build(rson,mid+1,r);
pushup(now);
}
void Modify(int now,int l,int r,int L,int R,int w)
{
if(L<=l&&r<=R){puttag(now,w);return;}
int mid=(l+r)>>1;pushdown(now);
if(L<=mid)Modify(lson,l,mid,L,R,w);
if(R>mid)Modify(rson,mid+1,r,L,R,w);
pushup(now);
}
int Query(int now,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return ans[now];
int mid=(l+r)>>1,ret=0;pushdown(now);
if(L<=mid)ret+=Query(lson,l,mid,L,R);
if(R>mid)ret+=Query(rson,mid+1,r,L,R);
return ret;
}
int py,N,num[MAX<<4],L;
void Modify(int x,int w)
{
int k=num[py+x]+(w>0);num[py+x]+=w;
if(x<=n)Modify(1,1,N,py+x-k+1,py+x-k+1,w);
}
int main()
{
n=read();m=read();N=(n+m)*2+1;py=n+m;Build(1,1,N);
for(int i=1;i<=n;++i)Modify(a[i]=read(),1);
while(m--)
{
int p=read(),x=read();
if(p>0)Modify(a[p]+L,-1),a[p]=x-L,Modify(a[p]+L,1);
else if(x>0)
{
--py;++L;int pos=py+n+1;
if(num[pos]>0)Modify(1,1,N,pos-num[pos]+1,pos,-1);
}
else
{
int pos=py+n+1;++py;--L;
if(num[pos]>0)Modify(1,1,N,pos-num[pos]+1,pos,1);
}
printf("%d\n",Query(1,1,N,py+1,py+n));
}
return 0;
}

[BJOI2019]删数(线段树)的更多相关文章

  1. [Luogu5324][BJOI2019]删数(线段树)

    CF风格题,先猜结论,记数列中i这个数共出现了cnt[i]次,那么所有区间[i-cnt[i]+1,i]的并集的补集大小就是答案. 于是我们只需要线段树维护每个位置是否被某个区间覆盖到即可,对于整体加减 ...

  2. 【BJOI2019】删数 线段树

    题目大意:一个数列若能在有限次数内删空,则称这个数列可以删空,一次删除操作定义如下: 记当前数列长度为$k$,则删掉数列中所有等于$k$的数. 现在有一个长度为$n$的数列$a$,有$m$次修改操作, ...

  3. [BJOI2019] 删数 [dp转贪心结论+线段树]

    题面 传送门 思路 dp部分 以下称合法序列为原题面中可以删空的序列 这个是我在模拟考场上的思路 一开始我是觉得,这个首先可以写成一个dp的形式:$dp[i][j]$表示用$j$个数字填满了目标序列的 ...

  4. Luogu5324 BJOI2019删数(线段树)

    考虑无修改怎么做.对于1~n的每个数,若其存在,将最后一个放在其值的位置,剩余在其前面依次排列,答案即为值域1~n上没有数的位置个数.带修改显然记一下偏移量线段树改一改就好了. #include< ...

  5. luogu P5324 [BJOI2019]删数

    传送门 不如先考虑暴力,能删的序列首先有\(1,2,3...n\),还有就是升序排序后从后往前放数,第\(i\)位要么放\(i\),要么放\(i+1\)位置的数,例如\(1,2,4,4,5,6,9,9 ...

  6. 题解 洛谷 P5324 【[BJOI2019]删数】

    先考虑对于一个序列,能使其可以删空的的修改次数. 首先可以发现,序列的排列顺序是没有影响的,所以可以将所有数放到桶里来处理. 尝试对一个没有经过修改的可以删空的序列来进行删数,一开始删去所有的\(n\ ...

  7. Problem 1007 幸运数 线段树成段更新

    题目链接: 题目 Problem 1007 幸运数 Time Limit: 2000 mSec Memory Limit : 131072 KB 问题描述 皮特的幸运数是2和5.只由幸运数字2和5组成 ...

  8. [BJOI2019] 删数

    https://www.luogu.org/problemnew/show/P5324 题解 首先我们需要弄清这个答案是什么. 对于一个长度为n的序列,那么它先删的肯定是\(n\),删完之后它就会跳到 ...

  9. hdu 4417 区间内比h小的数 线段树

    题意求区间内比h小的数的个数 将所有的询问离线读入之后,按H从小到大排序.然后对于所有的结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,然后就是一个区间和. 2015-07-27:专 ...

随机推荐

  1. java--变量,常量,数据类型的声明及使用

    一.概念: 变量是指内存中的一个存储区域,该区域要有自己的名称(变量名).类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值: 二.变量的使用注意事项: 1.Java中的变量必须声明后 ...

  2. 高淇java300集JAVA面向对象的进阶作业

    一.选择题 1.使用权限修饰符(B)修饰的类的成员变量和成员方法,可以被当前包中所有类访问,也可以被它的子类(同一个包以及不同包中的子类)访问.(选择一项) Apublic B.protected C ...

  3. 学习笔记—log4j2

    概念 什么是日志 日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及Bug的查找. log4j2的概念 log4j2是一个日志输出的插件,专门用来进行日志的管理. Log4j是Apa ...

  4. Swiper4.x使用方法

    1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件.可下载Swiper文件或使用CDN. <!DOCTYPE html> <html> ...

  5. WEB前端学习资源清单

    常用学习资源 JS参考与基础学习系列 [MDN]JS标准参考 es6教程 JS标准参考教程 编程类中文书籍索引 深入理解JS系列 前端开发仓库 <JavaScript 闯关记> JavaS ...

  6. H3C交换机S5500划分VLAN

    好记性不如烂笔头! H3C交换机S5500划分VLAN       将H3C S5500换机现在需要分三网段,分别是VLAN14,VLAN15,VLAN16,交换机中默认全部口是VLAN1.   H3 ...

  7. MongoDB自学(4)

    超过存储上限或记录条数删除最早的记录:db.createCollection("集合名",{capped:true,size:1024,max:100})注解:指定集合名的最大记录 ...

  8. xtrabackup备份mysql数据库方法

    1.安装 xtrabackup 工具包 下载percona yum源 https://www.percona.com/redir/downloads/percona-release/redhat/pe ...

  9. Windows7安装 docker-compose的过程

    Docker在Windows7系统上安装成功后[详情见Windows7下docker的安装以及遇到的问题],要用到docker-compose相关命令,而docker-compose相关命令在dock ...

  10. 前端之DOM

    老师的博客:https://www.cnblogs.com/liwenzhou/p/8011504.html DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方 ...