NOI 2024省选OIFC模拟21 蒲巴巴 超繁做法
题目描述
一年一度的 PuBaBa 杯开始了!
今年的 PuBaBa 杯总共有 \(n\) 个选手来参加,编号分别为 \(1,2,\cdots,n\),他们的水平按编号依次递增,所以他们过的题目数量单调不降。
作为本场比赛的出题人,PuBaBa 总共出了 \(m\) 道题,他希望第 \(i\) 道题至少有 \(l_i\) 个选手通过,至多有 \(r_i\) 个选手通过,PuBaBa 预计所有题的过题人数和为 \(S\)。
作为毒瘤出题人,PuBaBa 例行会在赛前举行“毒奶”活动。不过,PuBaBa 的毒奶是有依据的,他会计算每位选手最多过的题目数量。
不过,PuBaBa 有点太牛了,他决定将这个简单的任务交给您来完成。
输入格式
第一个,三个正整数 \(n,m,S\) 分别表示参赛选手,题目数量,以及总过题人数。
接下来 \(m\) 行,每行两个正整数 \(l_i,r_i\) 表示第 \(i\) 道题至少有 \(l_i\) 个选手通过,至多有 \(r_i\) 个选手通过。
输出格式
若无解,输出 "-1"(不包含双引号)。
否则,为了压缩输出量,我们令 \(ans_i\) 表示第 \(i\) 个选手的最多过题数。
您仅需输出 \(\bigoplus_{i=1}^{n} ans_ii\)。
样例
Input 1
3 5 8
1 3
2 3
1 3
2 3
1 3
Output 1
5
Input 2
10 8 41
1 7
5 6
5 7
4 9
7 10
1 2
3 10
3 5
Output 2
50
样例解释
对于样例一:\(ans\) 序列为 \(2,4,5\)。
对于样例二:\(ans\) 序列为 \(4,4,5,5,6,7,7,7,8,8\)。
数据范围
由于输入量很大,请使用快速的读入方式。
出题人为您准备了一份 fread 板子:https://www.luogu.com.cn/paste/xc3a5u5w。
测试点编号 \(n,m\le\) 特殊性质 \(1\sim 2\) \(5\) 无 \(3\) \(100\) 保证 \(l_i=r_i\) \(4\sim 5\) \(100\) 无 \(6\sim8\) \(1000\) 保证 \(l_i=r_i\) \(9\sim 10\) \(1000\) 无 \(11\sim12\) \(2\times 10^5\) 保证 \(l_i=r_i\) \(13\sim14\) \(10^5\) 无 \(15\sim16\) \(2\times 10^5\) 无 \(17\sim18\) \(5\times 10^5\) 无 \(19\) \(2\times10^6\) 无 \(20\) \(5\times10^6\) 无 对于 \(100\%\) 的数据,保证 \(1\le n,m \le 5\times 10^6\),\(1\le l_i\le r_i\le n\),\(1\le S\le nm\)。
比某些做法难,总之比题解简单
先问一个问题:一个长度为 \(n\) 的数组 \(a=\{0\}\),进行 \(m\) 次操作,每次操作选择若干个互不相同的位置使这些位置加 \(1\)。给你一个数组 \(b\),问这个数组可否通过上述 \(m\) 次操作得出来。
这题非常简单,我们只需要求出 \(\max_b\),若 \(\max_b\le m\) 则可以,否则不可以。
我们将原问题化为一个二维问题,横方向表示题目,纵方向表示这道题做出的人数,黄色矩形表示 \([l_i,r_i]\)。

明显得出,我们至少要填 \(\sum l_i\) 个格子,至多能填 \(\sum r_i\) 个格子。如果 \(\sum l_i\le S\le\sum r_i\) 不满足,则答案为 \(-1\)。
我们设考虑到第 \(i\) 个人,则后面有 \(p=n-i+1\) 个人。又设 \(ans_i=j\)。
考虑写一个 check,传入 \(p,j\),判断是否存在方案。
首先,有一个基础的构造,即必须在这个构造上动工。我们设第 \(i\) 个人的做题数为 \(a_i\)。
\]
明显,这是一个满足递增且第 \(i\) 个人为 \(j\) 的方案。它总共填了 \(p\times j\) 个格子。
先考虑后面 \(p\) 个人的部分。
我们发现,“做题”的操作就很像上面“加一”的操作——选择若干个互不相同的位置使这些位置加 \(1\)。因为有 \(p\) 个人,所以我们就有 \(p\) 次操作。同理,只有每道题过题人数都小于 \(p\) 才合法。(重申一下,先考虑后面 \(p\) 个人的部分)
也就是说,我们需要画一条粗线,只能取粗线下面的部分。(下面这张图举了 \(p=6\) 的例子)

我们发现,对于 \(l_i\le p\),是合法的,我们可以在后面的部分将其填完,不会超过 \(p\)。至少要填的格子数是 \(\sum l_i[l_i\le p]\)。
但对于 \(l_i>p\),我们只能填 \(p\) 个。只能填的格子数是 \(\sum p[l_i>p]\)。
我们可以发现,因为存在 \(l_i>p\),只能填 \(p\) 个的情况。我们需要在前面 \(n-p\) 个人补全这 \(\sum (l_i-p)[l_i>p]\) 个格子,那么现在每个题都满足下边界 \(l_i\) 了。
那么前面的 \(n-p\) 个人有没有足够的位置补全呢?
答案是有的!
设 \(x=\sum [l_i>p]\),说明 \(a_{n-p+1}\) 至少为 \(x\),最多有 \((n-p)x\) 个格子需要补全。
前面的 \(a_i\) 必须小于等于 \(x\),那么最多有 \((n-p)x\) 个位置,恰好可以补全!
我们发现,题目要求我们填恰好 \(S\) 个,我们不一定能填够。由于至少填 \(\sum l_i\) 个,我们有 \(S-\sum l_i\) 个“自由”的格子。
考虑将这些填给后面 \(l_i\le p\) 的题目,努力补全让它们尽量等于 \(p\)。那么总共有 \((S-\sum l_i)+(\sum l_i[l_i\le p])+(\sum p[l_i>p])\) 个格子。将其与至少的格子数 \(pj\) 做比较即可。
完了吗?当然没有。我们是不是忘了某个叫 \(r\) 的东西?
因为我们刚刚进行补全,有可能会补到 \(r\) 之外。我们要与至多的进行比较。
我们求出至多的格子数,同上为:\((\sum r_i[r_i\le p])+(\sum p[r_i>p])\),与刚刚的总共值取 \(\min\)。
也就是得到了 check 函数。
\]
然后发现答案肯定是递增的。
所以可以均摊线性得到答案。
#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
#define ll long long
#define N 5000010
ll n, m, s, mx, mn, ans[N], ANS;
ll l[N], r[N], sl[N], sr[N], cl[N], cr[N];
int main() {
// freopen("pubaba.in", "r", stdin);
// freopen("pubaba.out", "w", stdout);
scanf("%lld %lld %lld", &n, &m, &s);
for(ll i = 1; i <= m; i++) {
scanf("%lld %lld", &l[i], &r[i]);
mn += l[i], mx += r[i];
sl[l[i]] += l[i];
sr[r[i]] += r[i];
cl[l[i]] ++;
cr[r[i]] ++;
}
if(mn > s || mx < s) return printf("-1"), 0;
for(ll i = 1; i <= n; i++) {
sl[i] += sl[i-1];
sr[i] += sr[i-1];
}
for(ll i = n; i >= 1; i--) {
cl[i] += cl[i+1];
cr[i] += cr[i+1];
}
ll pos = n;
for(ll i = 1; i <= m; i++) {
while(min(s - mn + sl[pos - 1] + pos * cl[pos], sr[pos - 1] + pos * cr[pos]) < pos * i)
pos--;
ans[n - pos + 1] = i;
}
for(ll i = 1; i <= n; i++) {
ans[i] = max(ans[i-1], ans[i]);
ANS ^= ans[i] * i;
}
printf("%lld", ANS);
}
NOI 2024省选OIFC模拟21 蒲巴巴 超繁做法的更多相关文章
- NOIP模拟21+22
模拟21确实毒瘤...考场上硬刚T3 2.5h,成功爆零 T1.数论 看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律. 正解貌似是乱搞,我们考虑一个比较显然的结论: ...
- NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)
题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...
- NOI.AC省选模拟赛第一场 T1 (树上高斯消元)
link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...
- [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]
题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...
- [NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]
题面 传送门 思路 其实就是很明显的平面图模型. 不咕咕咕的平面图学习笔记 用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁 建立网络流图: 源点连接至每一个对偶图点,权值为这个区域的光明能量 ...
- [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...
- [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]
题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...
- [NOI.AC省选模拟赛3.23] 集合 [数学]
题面 传送门 一句话题意: 给定$n\leq 1e9,k\leq 1e7,T\leq 1e9$ 设全集$U=\lbrace 1,2,3,...n\rbrace $,求$(min_{x\in S}\lb ...
- [noi.ac省选模拟赛]第12场题解集合
题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...
- [noi.ac省选模拟赛]第10场题解集合
题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...
随机推荐
- [MAUI 项目实战] 音乐播放器(二):播放内核
播放控制服务 IMusicControlService: 播放控制类,用于当前平台播放器对象的操作,对当前所播放曲目的暂停/播放,下一首/上一首,快进快退(寻迹),随机.单曲模式等功能的控制. 播放控 ...
- Prometheus技术分享——如何监控宿主机和容器
这一期主要来跟大家聊一下,使用node_exporter工具来暴露主机和因公程序上的指标,利用prometheus来监控宿主机:以及通过通过Cadvisor监控docker容器. 一.部署node_e ...
- 图片裁剪插件 vue-cropper [vue插件推荐]
一个优雅的图片裁剪插件 https://www.npmjs.com/package/vue-cropper http://github.xyxiao.cn/vue-cropper/example/
- 2023山东省“技能兴鲁”职业技能大赛-学生组初赛wp
PWN pwn1 c++ pwn,cin 直接相当于 gets 了,程序有后门,保护基本没开,在 change 的最后一个输入点改掉返回地址为后门地址即可 from pwn import * cont ...
- 【大语言模型基础】GPT(Generative Pre-training )生成式无监督预训练模型原理
GPT,GPT-2,GPT-3 论文精读[论文精读]_哔哩哔哩_bilibili ELMo:将上下文当作特征,但是无监督的语料和我们真实的语料还是有区别的,不一定符合我们特定的任务,是一种双向的特 ...
- Rust 标准库 Trait 指南
部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...
- day04-3服务器推送新闻
多用户即时通讯系统04 4.编码实现03 4.7功能实现-服务器推送消息功能实现 4.7.1思路分析 服务器推送新闻,本质其实就是群发消息 在服务器启动一个独立线程,专门负责推送新闻 该线程通过管理线 ...
- 从API到Agent:万字长文洞悉LangChain工程化设计
我想做一个尝试,看看能不能用尽量清晰的逻辑,给"AI外行人士"(当然,我也是--)引入一下LangChain,试着从工程角度去理解LangChain的设计和使用.同时大家也可以将此 ...
- Caffe源码编译,win10+vs2015+Ninja,C++接口测试(mnist),Python接口测试(mnist),(坑爹篇)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 【牛客小白月赛51 F平均题】数论,前缀和
import java.io.IOException; import java.util.Scanner; public class Main { static int MOD = 100000000 ...