1 条题解

  • 0
    @ 2026-4-29 17:13:45

    详细题解:A Tale of Two Lands

    (数学化简 + 双指针 / 二分,O(nlogn)O(n\log n)

    一、核心公式化简(最关键部分)

    题目要求:

    $$\min(|x-y|,\ |x+y|)\ \le\ |x|,|y|\ \le\ \max(|x-y|,\ |x+y|) $$

    步骤 1:正负号不影响答案

    无论 x,yx,y 正负,只需要看它们的绝对值。 因为:

    • x,y|x|,|y| 不变
    • x+y|x+y|xy|x-y| 只是交换,不影响包含关系

    所以我们可以直接把所有数取绝对值


    步骤 2:最终等价条件

    x,y0x,y \ge 0,条件化简为:

    $$\boldsymbol{x \le 2y \quad \text{且} \quad y \le 2x} $$

    也就是说: 两个数中,较大的数不能超过较小数的 2 倍


    二、解法流程

    1. 把数组中所有数取绝对值
    2. 从小到大排序
    3. 使用双指针统计满足br2blb_r \le 2\cdot b_l 的无序数对 {l,r}\{l,r\} 数量

    三、双指针算法原理

    数组已排序:

    b1b2bnb_1 \le b_2 \le \dots \le b_n

    对每个左端点 ll

    • 找到最大的 rr 满足 br2blb_r \le 2\cdot b_l
    • 那么:l+1,,r1l+1,\dots,r-1 都和 ll 构成合法数对
    • 贡献:rl1\boldsymbol{r-l-1}

    总答案 = 所有贡献之和。


    四、标程代码(C++)

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        
        int n;
        cin >> n;
        vector<ll> a(n);
        for (auto &x : a) {
            cin >> x;
            x = abs(x);    // 取绝对值
        }
        
        sort(a.begin(), a.end());
        
        ll ans = 0;
        int r = 0;
        for (int l = 0; l < n; l++) {
            // 找到最远的 r 满足 a[r] <= 2*a[l]
            while (r < n && a[r] <= 2 * a[l])
                r++;
            ans += r - l - 1;
        }
        
        cout << ans << endl;
        return 0;
    }
    

    五、复杂度分析

    • 排序:O(nlogn)O(n\log n)
    • 双指针:O(n)O(n)
    • 总复杂度:O(nlogn)O(n\log n) 可轻松通过 n2105n \le 2\cdot 10^5

    六、样例解释

    样例 1

    输入:2 5 -3 取绝对值:[2,5,3] 排序:[2, 3, 5]

    • l=0l=0: r=2r=2 → 贡献 11
    • l=1l=1: r=2r=2 → 贡献 00
    • l=2l=2: r=3r=3 → 贡献 00

    答案:2


    样例 2

    输入:3 6 取绝对值:[3,6] 排序:[3,6]

    • l=0l=0: r=2r=2 → 贡献 11

    答案:1


    七、总结(一句话)

    把所有数取绝对值、排序, 双指针统计满足 大数 ≤ 2×小数 的无序数对数量

    • 1

    信息

    ID
    6711
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者