题目描述

一年一度的 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\)。

\[a=\{\underbrace{0,0,\cdots,0}_{n-p个0},\underbrace{j,j,\cdots,j}_{p个j}\}
\]

明显,这是一个满足递增且第 \(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 函数。

\[\min((S-\sum l_i)+(\sum l_i[l_i\le p])+(\sum p[l_i>p]),(\sum r_i[r_i\le p])+(\sum p[r_i>p]))\ge pj
\]

然后发现答案肯定是递增的。

所以可以均摊线性得到答案。

#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 蒲巴巴 超繁做法的更多相关文章

  1. NOIP模拟21+22

    模拟21确实毒瘤...考场上硬刚T3 2.5h,成功爆零 T1.数论 看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律. 正解貌似是乱搞,我们考虑一个比较显然的结论: ...

  2. NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)

    题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...

  3. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  4. [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]

    题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...

  5. [NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]

    题面 传送门 思路 其实就是很明显的平面图模型. 不咕咕咕的平面图学习笔记 用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁 建立网络流图: 源点连接至每一个对偶图点,权值为这个区域的光明能量 ...

  6. [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]

    题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...

  7. [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]

    题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...

  8. [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 ...

  9. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  10. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

随机推荐

  1. [MAUI 项目实战] 音乐播放器(二):播放内核

    播放控制服务 IMusicControlService: 播放控制类,用于当前平台播放器对象的操作,对当前所播放曲目的暂停/播放,下一首/上一首,快进快退(寻迹),随机.单曲模式等功能的控制. 播放控 ...

  2. Prometheus技术分享——如何监控宿主机和容器

    这一期主要来跟大家聊一下,使用node_exporter工具来暴露主机和因公程序上的指标,利用prometheus来监控宿主机:以及通过通过Cadvisor监控docker容器. 一.部署node_e ...

  3. 图片裁剪插件 vue-cropper [vue插件推荐]

    一个优雅的图片裁剪插件 https://www.npmjs.com/package/vue-cropper http://github.xyxiao.cn/vue-cropper/example/

  4. 2023山东省“技能兴鲁”职业技能大赛-学生组初赛wp

    PWN pwn1 c++ pwn,cin 直接相当于 gets 了,程序有后门,保护基本没开,在 change 的最后一个输入点改掉返回地址为后门地址即可 from pwn import * cont ...

  5. 【大语言模型基础】GPT(Generative Pre-training )生成式无监督预训练模型原理

    GPT,GPT-2,GPT-3 论文精读[论文精读]_哔哩哔哩_bilibili   ELMo:将上下文当作特征,但是无监督的语料和我们真实的语料还是有区别的,不一定符合我们特定的任务,是一种双向的特 ...

  6. Rust 标准库 Trait 指南

    部分内容来自 Rust 2021 年期刊 内容目录 引言 Trait 基础 自动 Trait 泛型 Trait 格式化 Trait 操作符 Trait 转换 Trait 错误处理 迭代器 Trait ...

  7. day04-3服务器推送新闻

    多用户即时通讯系统04 4.编码实现03 4.7功能实现-服务器推送消息功能实现 4.7.1思路分析 服务器推送新闻,本质其实就是群发消息 在服务器启动一个独立线程,专门负责推送新闻 该线程通过管理线 ...

  8. 从API到Agent:万字长文洞悉LangChain工程化设计

    我想做一个尝试,看看能不能用尽量清晰的逻辑,给"AI外行人士"(当然,我也是--)引入一下LangChain,试着从工程角度去理解LangChain的设计和使用.同时大家也可以将此 ...

  9. Caffe源码编译,win10+vs2015+Ninja,C++接口测试(mnist),Python接口测试(mnist),(坑爹篇)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. 【牛客小白月赛51 F平均题】数论,前缀和

    import java.io.IOException; import java.util.Scanner; public class Main { static int MOD = 100000000 ...