1 条题解

  • 0
    @ 2026-4-1 17:46:22

    核心目标

    计算出符合条件的 ll'rr',并输出。

    解题核心思路拆解

    1. 关键变量定义

    • 原区间:[n,n][-n,n],总长度为 2n2n
    • 目标长度:mm,因此需要删除的总长度为 diff=2nm\mathit{diff}=2n-m(原长度 - 目标长度)。
    • 输入约束:ll 是负数(或 00),rr 是正数(或 00),最终的 ll' 必须 l\ge lrr' 必须 r\le r,且 l0rl' \le 0 \le r'

    2. 核心策略:优先删除单侧,再删另一侧

    我们需要从**左侧(负数区间)和右侧(正数区间)**逐步删除长度,直到总删除长度达到 diff\mathit{diff}

    • 第一步:优先处理左侧的删除量(因为 ll 是负数,删除左侧会让 ll' 变大,满足 lll' \ge l)。
    • 第二步:左侧删完后,再处理右侧的删除量(删除右侧会让 rr' 变小,满足 rrr' \le r)。

    3. 公式推导逻辑

    • 计算需要删除的总长度:diff=nm\mathit{diff}=n-m(代码中 nn 是原区间半长,2n2n 是总长度,2nm=(nm)+(nm)2n-m=(n-m)+(n-m),代码中 diff\mathit{diff} 初始化为 nmn-m,代表单侧的最大可删除空间,最终总删除量为 2×diff2 \times \mathit{diff} 或按需分配)。
    • 处理左侧删除:原左端点是 n-n,输入的 ll 是负数,l=abs(l)l=\text{abs}(l) 表示从 n-nll 的距离。如果左侧可删除的空间 ldiffl \ge \mathit{diff},说明可以从左侧删完所有需要的长度;否则,左侧删满,剩余删除量从右侧删。
    • 计算最终区间:根据删除量调整左右端点,保证 lll' \ge lrrr' \le r

    标准程序代码(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
    上传者