视频加载失败

题解:AT_abc365_c [ABC365C] Transportation Expenses

题解:AT_abc365_c [ABC365C] Transportation Expenses
613 字
3 分钟
题解:AT_abc365_c [ABC365C] Transportation Expenses
Tip

注:为了方便,下文以 SumSum 表示 ∑i=1nAi\sum_{i = 1}^{n} A_i。


N=2×105N = 2 \times 10^5,考虑二分答案。

所以,答案有单调性吗?或者说,可以二分吗?

当然!如果 x=kx = k 时可以满足条件,那么 x=k−1x = k - 1 时显然只会更少(上面取 min⁡\min 的基本都没变,变了的取了更少的),一样能满足条件。

check⁡\operatorname{check} 函数怎么写?扫一遍嘛,时间复杂度 O(n)O(n),鉴于后面是 log⁡\log 级别的复杂度这里就算暴力扫也超不了。

这样我们只需要考虑二分的上下界就好了。最低直接让 x=0x = 0 好了,最高肯定不会超过 SumSum(超了那还了得?多的钱幽灵拿了?),就以此为界二分吧!

等等,我们漏了一个很重要的情况!那就是——无!解!

啥时候可以取到无限啊?

按照题意,需要的钱数最大也只有 SumSum 这么多,如果这还不到 mm,即 Sum≤mSum \le m,那么 xx 自然可以随便取,反正钱数都没它啥事儿……

还有一点,上面这一大堆东西时间复杂度到底是多少呢?

显然时间复杂度为 Θ(Nlog⁡Sum)\Theta(N \log Sum)。感觉会超?注意时间限制是 2s !拿计算器摁一下,最大值(两项都取到最大)大概是 9.5×1079.5 \times 10^7,不会超~

然后就真的结束了……


ACCode:

/*Code by Block_Fish*/
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define FOR(i, l, r) for (ll(i) = (l); (i) <= (r); ++(i))
#define log printf
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(nullptr); \
cout.tie(nullptr);
using namespace std;
typedef __int128 i128;
typedef long long ll;
typedef pair<ll, ll> PII;
const ll N = 2e5 + 10;
ll m, n, a[N], sum;
template <typename T>
inline T read() {
T sum = 0, fl = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-') fl = -1;
for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0';
return sum * fl;
}
template <typename T>
inline void write(T x) {
if (x < 0) {
putchar('-'), write<T>(-x);
return;
}
static T sta[35];
ll top = 0;
do { sta[top++] = x % 10, x /= 10; } while (x);
while (top) putchar(sta[--top] + 48);
}
inline bool chk(ll q) {
ll sum = 0;
FOR(i, 1, n) {
sum += min(q, a[i]);
if (sum > m) return 0;
}
return sum <= m;
}
int main() {
scanf("%lld%lld", &n, &m);
FOR(i, 1, n) scanf("%lld", &a[i]), sum += a[i];
if (sum <= m) {
log("infinite");
return 0;
}
ll l = 0, r = sum, ret = -1;
while (l <= r) {
ll mid = (l + r) >> 1;
if (chk(mid)) {
ret = mid;
l = mid + 1;
} else r = mid - 1;
}
log("%lld\n", ret);
return 0;
}

AC 记录~

理解万岁!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
题解:AT_abc365_c [ABC365C] Transportation Expenses
https://www.leo2011.eu.org/posts/atc-abc365c/
作者
Block_Fish
发布于
2024-08-03
许可协议
SATA

评论区

Profile Image of the Author
Block_Fish
大胆假设,小心求证。——胡适
公告
网站全面重构,有问题欢迎联系积木鱼!
分类
标签
最新动态
站点统计
文章
56
分类
7
标签
17
总字数
84,805
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.16.8
文章许可
SATA

当前页面没有目录

文章目录

当前页面没有目录