1 条题解
-
0
核心目标
计算出符合条件的 和 ,并输出。
解题核心思路拆解
1. 关键变量定义
- 原区间:,总长度为 。
- 目标长度:,因此需要删除的总长度为 (原长度 目标长度)。
- 输入约束: 是负数(或 ), 是正数(或 ),最终的 必须 , 必须 ,且 。
2. 核心策略:优先删除单侧,再删另一侧
我们需要从**左侧(负数区间)和右侧(正数区间)**逐步删除长度,直到总删除长度达到 。
- 第一步:优先处理左侧的删除量(因为 是负数,删除左侧会让 变大,满足 )。
- 第二步:左侧删完后,再处理右侧的删除量(删除右侧会让 变小,满足 )。
3. 公式推导逻辑
- 计算需要删除的总长度:(代码中 是原区间半长, 是总长度,,代码中 初始化为 ,代表单侧的最大可删除空间,最终总删除量为 或按需分配)。
- 处理左侧删除:原左端点是 ,输入的 是负数, 表示从 到 的距离。如果左侧可删除的空间 ,说明可以从左侧删完所有需要的长度;否则,左侧删满,剩余删除量从右侧删。
- 计算最终区间:根据删除量调整左右端点,保证 且 。
标准程序代码(C++)
#include <bits/stdc++.h> using namespace std; #define int long long void solve() { int n, m, l, r; cin >> n >> m >> l >> r; int diff = n - m; // 需从两端删除的总长度 l = abs(l); // 左端点到0的距离(原l为负数) if (l >= diff) { // 仅从左侧删除diff个单位,右侧不动 l -= diff; diff = 0; } else { // 左侧删完,剩余diff从右侧删除 diff -= l; l = 0; } // 输出最终区间:左端点还原为负数,右端点减去剩余删除长度 cout << -l << " " << r - diff << '\n'; } signed main() { ios_base::sync_with_stdio(0); // 关闭同步加速输入输出 cin.tie(0); // 解绑cin与cout int t; cin >> t; while (t--) solve(); return 0; }
- 1
信息
- ID
- 6213
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者