洛谷5324 删数
这种题看起来很难确定如何给出一个简单的判别方法去判断是否符合条件的一般都是证明下界再构造下界
首先给出结论:对于一个数列,某一个数字
证明:先证一个数列能被删除,当且仅当
该结论的充分性显然
必要性:由于
如果某一个数字产生的区间的左边界小于
无论是操作一还是操作二,一次操作最多只能让
那么我们接下来构造一个方法来达到这个下界,为了方便说明,我们约定
由于
证毕
那么考虑修改,对整个数列加一或者减一,就是让所有产生的区间往旁边移动一位,我们采用相对性的思路,让查询区间往旁边移动一位,这样就可以极大降低复杂度
这里线段树维护要用到类似扫描线的方法
update 2024.5.16
独立做出来了,来说一下怎么想到的
首先就像上面说的一样,很容易发现如果能删除的话,最大的数字一定是
然后是代码的问题,非常复杂,光代码就写了两个半小时
首先我没有用扫描线维护
我们按照上述过程分析,就可以知道,假设我们将序列分成三段,分别是下标小于等于
所以我们只用考虑维护序列
然后跟"Atlantis"很像了,这里就要用扫描线(去想一下,还没认真想),但其实有另一种方法
定义结构体
struct node
{
int l,r;
int lazy,summin,Min;//summin表示这个区间最小值的数量
}t[(N*3)<<2];
于是我们实时维护最小值的数量就好了,修改函数也比较简单
void modify(int p,int x,int y,int d)
{
if(t[p].l>y||t[p].r<x) return;
if(t[p].l>=x&&t[p].r<=y)
{
t[p].lazy+=d;
t[p].Min+=d;
return;
}
putdown(p);
modify(p<<1,x,y,d),modify(p<<1|1,x,y,d);
if(t[p<<1].Min<t[p<<1|1].Min) t[p].summin=t[p<<1].summin;
else if(t[p<<1].Min>t[p<<1|1].Min) t[p].summin=t[p<<1|1].summin;
else t[p].summin=t[p<<1].summin+t[p<<1|1].summin;//这三个讨论非常easy
t[p].Min=min(t[p<<1].Min,t[p<<1|1].Min);
}
那么最终在查询的时候,先查询最小值,如果说最小值不是
但是其实这道题目最难的是偏移的问题,有点绕
我们偏移的思路是不动数字动区间,而真实情况应该是不动区间动数字
比如,当前区间为1 2 3 4 5
,那么真实的区间就是4 5 6 7 8
我们用一个数组cnt
去记录每一个数字的数量,但是偏移的时候到底应该算什么呢?
先来看整体加一减一的情况
...
if(!op)
{
if(x==1)
{
if(cnt[R]) modify(1,R-cnt[R]+1,R,-1);
modify(1,R,R,cnt[R]);
}
else
{
modify(1,R+1,R+1,-cnt[R+1]);
if(cnt[R+1]) modify(1,R+1-cnt[R+1]+1,R+1,1);
}
L-=x,R-=x,delta+=x;
}
...
我们肯定是没办法偏移cnt
数组的,所以任意时候,cnt[i]
就表示当前区间下标为delta
,那么也就是真实区间中数字cnt[R-delta]
这种东西
再来看看单点修改
...
else
{
int y=a[op];
x-=delta;
if(x==y) goto L;
if(y+m<=R) modify(1,y+m-cnt[y+m]+1,y+m-cnt[y+m]+1,-1);
else modify(1,y+m,y+m,-1);
if(x+m<=R) modify(1,x+m-cnt[x+m],x+m-cnt[x+m],1);
else modify(1,x+m,x+m,1);
cnt[x+m]++,cnt[y+m]--;
a[op]=x;
}
...
任意时刻,a[i]
记录的是真实区间中下标为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构