Content

给出一个范围为 \([-k,k]\) 的数轴,数轴上有 \(n\) 个点,第 \(i\) 个点的位置为 \(a_i\)。有 \(m\) 次操作,有且仅有以下三种:

  • 1 x:所有点往右移动 \(x\) 个单位。
  • 2 x:所有点往左移动 \(x\) 个单位。
  • 3:求出还在数轴范围以内的点的个数。

如果在某个操作中有点移出数轴范围了,那么尽管后面的操作能够把它拉回数轴上来,它也不能够回到数轴上面来了。

数据范围:\(1\leqslant n,m\leqslant 3\times 10^5\),\(1\leqslant k,x\leqslant 2\times 10^9\),\(-k\leqslant a_i\leqslant k\)。

Solution

方法非常地清晰,可以说是整场比赛最良心的一道题目。

首先,为了保证下面的解法合理,我们先将所有的点按照 \(a_i\) 升序排序(注意!题目中并没有保证这一点!)。

然后我们不难发现,还在数轴范围上的点一定是在某个区间上的一个整体。所以我们考虑存储左边界和右边界。还需要将所有点往右移动的距离记为 \(dis\)。

对于操作 \(1\),我们只需要将 \(dis\leftarrow dis+x\),然后再从右往左遍历所有编号在 \([l,r]\) 范围内的点:

  • 如果当前遍历的点在之前已经不在数轴范围内了,那么停止遍历。
  • 否则,如果当前遍历的点 \(a_i+dis>k\),也就是超过了右边界,那么将它标记一下,并且将用来统计在该次操作中被移除数轴范围的点的个数的计数器 \(cnt\) 加 \(1\)。
  • 否则,就说明当前遍历的点在数轴范围了,不用再往左遍历了,停止遍历。
  • 操作完以后记得将右边界 \(r\) 减去统计的在该次操作中被移除数轴范围的点的个数,即 \(r\leftarrow r-cnt\)。

对于操作 \(2\),我们只需要将 \(dis\leftarrow dis-x\),然后再从左往右遍历所有编号在 \([l,r]\) 范围内的点:

  • 如果当前遍历的点在之前已经不在数轴范围内了,那么停止遍历。
  • 否则,如果当前遍历的点 \(a_i+dis<-k\),也就是超过了左边界,那么将它标记一下,并且将用来统计在该次操作中被移除数轴范围的点的个数的计数器 \(cnt\) 加 \(1\)。
  • 否则,就说明当前遍历的点在数轴范围了,不用再往右遍历了,停止遍历。
  • 操作完以后记得将左边界 \(l\) 加上统计的在该次操作中被移除数轴范围的点的个数,即 \(l\leftarrow l+cnt\)。

对于操作 \(3\),我们需要特判一下是否有 \(r<l\),如果是的话说明已经没有点在数轴上面了,答案是 \(0\),否则答案就是 \(r-l+1\)。

最后注意一点,上面的操作中 \(a_i+dis\) 可能会超出 int 的范围 \([-2^{31},2^{31})\),会导致你 WA 50,因此要开 long long

Code

const int N = 3e5 + 7;
int n, m, k, L, R, l, r, x, vis[N];
ll dis, a[N]; int main() {
n = Rint, m = Rint, k = Rint, L = -k, R = k, l = 1, r = n;
F(int, i, 1, n) a[i] = Rint; sort(a + 1, a + n + 1);
while(m--) {
int op = Rint, out = 0;
if(op == 1) {
dis += (x = Rint);
R(int, i, r, l) {
if(vis[i]) break;
else if(a[i] + dis > R) vis[i] = 1, out++;
else break;
}
r -= out;
} else if(op == 2) {
dis -= (x = Rint);
F(int, i, l, r) {
if(vis[i]) break;
else if(a[i] + dis < L) vis[i] = 1, out++;
else break;
}
l += out;
} else println(r < l ? 0 : r - l + 1);
}
return 0;
}

LuoguP7505 「Wdsr-2.5」小小的埴轮兵团 题解的更多相关文章

  1. 「JOISC 2020 Day2」变态龙之色 题解

    题目传送门 注意 同性必定不同色 必有一个同色异性,且不相互不喜欢 Solution 我们发现,我们问题比较大的就是如何确定性别问题.我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系 ...

  2. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  3. 「雕爷学编程」Arduino动手做(15)——手指侦测心跳模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  4. [转帖]「知乎知识库」— 5G

    「知乎知识库」— 5G 甜草莓 https://zhuanlan.zhihu.com/p/55998832 ​ 通信 话题的优秀回答者 已关注 881 人赞同了该文章 谢 知识库 邀请~本文章是几个答 ...

  5. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  6. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  7. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  8. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  9. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

随机推荐

  1. 【论文阅读】Beyond OCR + VQA: 将OCR融入TextVQA的执行流程中形成更鲁棒更准确的模型

    论文题目:Beyond OCR + VQA: Involving OCR into the Flow for Robust and Accurate TextVQA 论文链接:https://dl.a ...

  2. Codeforces 1383D - Rearrange(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...

  3. SSRF的原理和防范

    背景 最近做的安全测评主要是SSRF,发现自己在这一块有挺大知识盲点,抓紧补一下. 1.介绍 SSRF(Server-Side Request Forgery:服务器端请求伪造),是一种攻击者利用服务 ...

  4. 如何使用scp在Linux服务器的后台传输文件?

    目录 一.上传 常规操作 建议 后台运行 二.下载 两台服务器间文件如何传输?对于小文件,可以先从Linux服务器传到window,再传到另一台服务器.对于大的文件,如测序数据.比对文件等.这样的方法 ...

  5. 使用 CliWrap 让C#中的命令行交互举重若轻

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliW ...

  6. C语言中的重要位运算

    1. 常用的等式 :-n = ~(n-1) = ~n + 1. 2. 获取整数n的人进制形式中的最后1个,也就是只保留最后一个1,其余的全部置位0,如1000 0011 --->  0000 0 ...

  7. TD课程通最终版本体验

    功能上,新版本增加了学校教室的上课情况,有无课程可以清楚查询,如下图: 在添加课程的设置上有改进,相比于之前编辑课程后不能保存,新版本在可保存的基础上又增加了登陆教务系统的功能,学生使用更加方便快捷, ...

  8. 日常Java 2021/10/12

    封装 在面向对象程式设计方法中,封装是指-种将抽象性函式接口的实现细节部分包装.隐藏起来的方法 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问 要访问该类的代码和数据,必 ...

  9. 27.0 linux VM虚拟机IP问题

    我的虚拟机是每次换一个不同的网络,b不同的ip,使用桥接模式就无法连接,就需要重新还原默认设置才行: 第一步:点击虚拟机中的编辑-->虚拟网络编辑器 第二步:点击更改设置以管理员权限进入 第三步 ...

  10. Java【常用的日期操作】

    目录 1.设置时间 2.获取年月日时分秒 3.通过运算获取时间 4.和Date类转换 5.格式化时间 6.新功能LocalDate:当前日期格式化 7.示例 java.util.Calendar 类是 ...