专栏文章

AT_abc388_c [ABC388C] Various Kagamimochi

AT_abc388_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqjcpk4
此快照首次捕获于
2025/12/04 05:45
3 个月前
此快照最后确认于
2025/12/04 05:45
3 个月前
查看原文

题目

NN 个年糕,按大小升序排列。第 ii 个年糕的大小是 Ai (1iN)A_i \ (1 \le i \le N)
给定大小分别为 aabb 的两个年糕 AABB,当且仅当 aa 小于等于 bb 的一半时,你可以将年糕 AA 放在年糕 BB 的上面,制作一个叠年糕。
你从 NN 个年糕中选择两个年糕,并将一个放在另一个上面,组成一个叠年糕。求可以做出多少种不同的叠年糕。

思路

由于 2N5×1052 \le N \le 5 \times 10^5,很明显直接遍历所有年糕会超时。
既然直接求解不好求,那么我们就换一种思路。我们先选定一个年糕作为叠年糕中上面的年糕,设它的大小为 aa。因为 AiAi+1A_i \le A_{i+1},所以不难想出如果第 ii 个年糕的大小满足 aAi2a \le \dfrac{A_i}{2}(即可以作为叠年糕中下面的年糕),那么在这个年糕后面的年糕的大小也一定满足,我们就没有必要去判断了。
这样,我们只要求出第一个符合要求的年糕的下标,从而求出符合要求的年糕的数量即可。
这里,我用 C++ 自带的 lower_bound 函数(不会用的可自行上网查询)去二分查找这个下标。

代码

十年 OI 一场空,不开 long long 见祖宗。
CPP
#include <bits/stdc++.h>

using namespace std;

long long n, a[500010], res, pos;

int main()
{
	scanf("%lld", &n);
	for (int i = 0; i < n; i ++ )
		scanf("%lld", &a[i]);
	for (int i = 0; i < n; i ++ )
	{
		pos = lower_bound(a, a + n, a[i] * 2) - a;
		res += n - pos;
	}
	cout << res << '\n';
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...