1 条题解

  • 0
    @ 2026-11-2 13:11:02

    奶牛狂欢节加强版(MooFest G) 题解

    思路分析

    按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。

    参考代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const int MAX_X = 50005;
    
    struct BIT {
        long long tree[MAX_X];
        void add(int idx, long long v) {
            for (int i = idx; i < MAX_X; i += i & -i) tree[i] += v;
        }
        long long query(int idx) const {
            long long s = 0;
            for (int i = idx; i > 0; i -= i & -i) s += tree[i];
            return s;
        }
    } bitCnt, bitSum;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        if (!(cin >> n)) return 0;
        vector<pair<long long, int>> cows(n);
        for (int i = 0; i < n; ++i) {
            cin >> cows[i].first >> cows[i].second;
        }
        sort(cows.begin(), cows.end());
        const long long MOD = 998244353LL;
        long long totalX = 0;
        long long ans = 0;
        for (int i = 0; i < n; ++i) {
            long long v = cows[i].first;
            int x = cows[i].second;
            long long cntL = bitCnt.query(x);
            long long sumL = bitSum.query(x);
            long long cntR = i - cntL;
            long long sumR = totalX - sumL;
            long long distSum = (cntL * x - sumL) + (sumR - cntR * x);
            ans = (ans + (distSum % MOD) * (v % MOD)) % MOD;
            bitCnt.add(x, 1);
            bitSum.add(x, x);
            totalX += x;
        }
        cout << ans << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    8643
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者