1 条题解
-
0
📝 题目大意
给定 ,求满足 且 的整数三元组 的个数。共 组询问。
💡 解题思路
-
题目分析: 由 唯一确定(),因此问题转化为求满足 且 的二元组 数量。数据范围 ,,每组询问需要 回答。
-
算法推导:
- 由 且 ,得约束 。
- 等价于 。
- 结合 ,固定 时 的取值范围为 。
- 由于 ,有 (),故 。
- 由于 ,有 ,故 。
- 因此固定 时,,合法 的个数为 。
- 要求区间非空即 ,也就是 。同时 ,所以 的取值范围为 。
- 该区间非空的条件是 ,即 。若 ,答案为 (不存在满足条件的 ,因为 最大为 ,而 至少为 ,需要 )。
- 当 时,令 。枚举 从 到 ,令 ( 从 到 ),此时合法 个数为 。
- 求和得:$$\sum_{i=0}^{R-2L} (k - i) = k + (k-1) + \cdots + 1 = \frac{k(k+1)}{2}$$
- 代入 ,得最终公式:
-
边界与细节:
- 的情况:公式仍然适用。例如 ,,,,对应 。
- 的情况:,,仅有一种情况()。
- 的情况:
if条件不成立,ans保持为 ,直接输出。 - 溢出:,,,在
long long范围内,但需注意使用long long类型。
⏱️ 复杂度分析
- 时间复杂度:每组数据 计算,总复杂度 。
- 空间复杂度:仅使用常数个变量,。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; #define ll long long int main() { int tt; cin >> tt; while(tt--){ ll l, r; cin >> l >> r; ll ans = 0; // 当 2L <= R 时才有解,否则 ans = 0 if(r >= 2 * l) // k = R - 2L + 1, ans = k * (k + 1) / 2 ans = (r - 2 * l + 1) * (r - 2 * l + 2) / 2; cout << ans << '\n'; } return 0; } -
- 1
信息
- ID
- 860
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者