ARC 175 C 题解
我们考虑经典套路,假设前 个数已经被确定。
设 表示 时 的最小值。
那么, 当且仅当 取最小值且 为所有可能中的最小值。
我们设集合 。
一个奇妙性质: 一定是一个区间。
感性理解。容易发现 是一个凸函数,所以当取到最小值时,取值定为一个区间。
我们考虑 怎么求。
丁真一下。我们可以考虑直接贪心。若 ,则 取 。然后转移还是比较简单的。
我们设 :
以上贪心可以通过大力分讨得证。
但是这一眼正确吧。
那么我们观察 的转移式,发现最小值是非常能确定的。于是得到下列结论:
- 如果 ,则 。
- 如果 ,则 。
- 如果 ,则 。
综上,我们求出了 。 实际上不需要求出。
回到原题。我们要找到 使 取最小值且 为所有可能中的最小值。
仍然是大力分讨:
-
时,。
-
时,。
-
时,。
-
时,。
发现上述过程可以简化为 取 中最靠近 的值。
以下是代码实现。
#include <bits/stdc++.h>
using namespace std;
long long read() {
char c = getchar();
long long x = 0, p = 1;
while ((c < '0' || c > '9') && c != '-') c = getchar();
if (c == '-') p = -1, c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * p;
}
const int N = 5e5 + 7;
int n;
int l[N], r[N], L[N], R[N];
int ans[N];
void solve() {
n = read();
for (int i = 1; i <= n; i ++)
L[i] = read(), R[i] = read();
l[n] = L[n], r[n] = R[n];
for(int i = n - 1; i >= 1; i --) {
if (R[i] < l[i + 1]) {
l[i] = r[i] = R[i];
} else if (L[i] > r[i + 1]) {
l[i] = r[i] = L[i];
} else {
l[i] = max(L[i], l[i + 1]);
r[i] = min(R[i], r[i + 1]);
}
}
ans[1] = l[1];
for(int i = 2; i <= n; i++) {
if (ans[i - 1] >= l[i] && ans[i - 1] <= r[i])
ans[i] = ans[i - 1];
else if (ans[i - 1] >= L[i] && ans[i - 1] < l[i])
ans[i] = ans[i - 1];
else if (ans[i - 1] < L[i])
ans[i] = L[i];
else ans[i] = r[i];
}
for(int i = 1; i <= n; i ++) cout << ans[i] << ' ';
}
signed main() {
int t = 1;
while (t --) solve();
return 0;
}
作者:DE_aemmprty
出处:https://www.cnblogs.com/aemmprty/p/18097471
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库