[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. 用.net写Textbox控件关于数字的判断的二则方法

    方法一.使用textboxSelected事件进行判断首界面源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  2. wkhtmltox实现网页转换成图片或pdf

    1.先下载http://download.gna.org/wkhtmltopdf/obsolete/windows/wkhtmltox-0.11.0_rc1-installer.exe,安装 2.在命 ...

  3. Ubuntu16.04安装Qt5.12.2

    第一步:下载文件 https://download.qt.io/official_releases/qt/5.12/5.12.2/ 第二步:安装依赖库 sudo apt-get install bui ...

  4. 文本相似度 — TF-IDF和BM25算法

    1,$TF-IDF$算法 $TF$是指归一化后的词频,$IDF$是指逆文档频率.给定一个文档集合$D$,有$d_1, d_2, d_3, ......, d_n \in D$.文档集合总共包含$m$个 ...

  5. [十二省联考2019]D2T2春节十二响

    嘟嘟嘟 这题真没想到这么简单-- 首先有60分大礼:\(O(n ^ 2logn)\)贪心.(我也不知道为啥就是对的) 然后又送15分链:维护两个堆,每次去堆顶的最大值. 这时候得到75分已经很开心了, ...

  6. 13 在 Django REST framework 善用 SerializerMethodField方法

    01-使用SerializerMethodField 来优化不必要的查询 class RepairQueueSerializer(serializers.ModelSerializer): # rq_ ...

  7. neutron二

    第四篇neutron— 网络实践   一.虚拟机获取 ip:   用 namspace 隔离 DHCP 服务   Neutron 通过 dnsmasq 提供 DHCP 服务,而 dnsmasq 通过 ...

  8. Neutron Vlan Network 学习

    vlan network 是带 tag 的网络,是实际应用最广泛的网络类型.    下图是 vlan100 网络的示例.   1. 三个 instance 通过 TAP 设备连接到名为 brqXXXX ...

  9. [Alpha阶段]测试报告

    [Alpha]阶段测试报告 在测试过程中发现的BUG ​ 在最后的测试阶段中,我们不可避免的遇到了各种各样的BUG.虽然大多数都不是严重的BUG,但是这些细枝末节的问题的堆积,依然会很大程度上降低用户 ...

  10. [题解]玩具谜题(toy)

    玩具谜题(toy) 来源:noip2016 提高组 day1 [题目描述] 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个 ...