QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#696752#9528. New Energy VehicleSocialPandaWA 0ms3780kbC++234.0kb2024-11-01 01:08:182024-11-01 01:08:20

Judging History

This is the latest submission verdict.

  • [2024-11-01 01:08:20]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 3780kb
  • [2024-11-01 01:08:18]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;
const int MAXN = 1e6 + 10;

// 线段树节点
struct SegmentTree {
    int n;
    vector<int> tree;

    void init(int _n) {
        n = _n;
        tree.resize(4 * n, 0);
    }

    void update(int pos, int val) {
        update(1, 1, n, pos, val);
    }

    void update(int node, int start, int end, int pos, int val) {
        if (start == end) {
            tree[node] += val;
            return;
        }
        int mid = (start + end) / 2;
        if (pos <= mid) {
            update(2 * node, start, mid, pos, val);
        } else {
            update(2 * node + 1, mid + 1, end, pos, val);
        }
        tree[node] = tree[2 * node] + tree[2 * node + 1];
    }

    int query(int left, int right) {
        return query(1, 1, n, left, right);
    }

    int query(int node, int start, int end, int left, int right) {
        if (left > end || right < start) return 0;
        if (left <= start && end <= right) return tree[node];
        int mid = (start + end) / 2;
        return query(2 * node, start, mid, left, right) + query(2 * node + 1, mid + 1, end, left, right);
    }

    // 找到前缀和大于等于 target 的最小位置
    int find_prefix_sum(int target) {
        return find_prefix_sum(1, 1, n, target);
    }

    int find_prefix_sum(int node, int start, int end, int target) {
        if (start == end) {
            return start;
        }
        int mid = (start + end) / 2;
        if (tree[2 * node] >= target) {
            return find_prefix_sum(2 * node, start, mid, target);
        } else {
            return find_prefix_sum(2 * node + 1, mid + 1, end, target - tree[2 * node]);
        }
    }
};

void solve() {
    int n, m;
    cin >> n >> m;

    vector<int> a(n + 10), v(n + 10);
    vector<PII> c(m + 10);

    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        v[i] = a[i];
    }
    for (int i = 1; i <= m; ++i) {
        cin >> c[i].first >> c[i].second;
    }

    unordered_map<int, int> mp;
    vector<int> q(m + 10);
    int ll = 0, rr = -1;

    for (int i = 1; i <= m; ++i) {
        mp[c[i].second]++;
        q[++rr] = c[i].second;
    }

    int cur = 0, hou = 0;
    for (int i = 1; i <= n; ++i) {
        if (mp[i] == 0) {
            hou += a[i];
            a[i] = 0;
        }
    }

    SegmentTree segTree;
    segTree.init(n);

    for (int i = 1; i <= n; ++i) {
        segTree.update(i, a[i]);
    }

    for (int i = 1; i <= m; ++i) {
        int psi = c[i].first;
        int sn = c[i].second;

        int need_go = psi - cur;
        int _need_go = need_go;

        while (need_go > 0) {
            if (ll > rr) {
                int can_go = min(need_go, hou);
                hou -= can_go;
                need_go -= can_go;
                break;
            }

            int prefix_sum = segTree.query(1, q[ll]);
            if (prefix_sum >= need_go) {
                int pos = segTree.find_prefix_sum(need_go);
                int act_go = min(need_go, a[pos]);
                need_go -= act_go;
                a[pos] -= act_go;
                segTree.update(pos, -act_go);
            } else {
                need_go -= prefix_sum;
                ll++;
            }
        }

        if (need_go > 0) {
            cout << cur + (_need_go - need_go) << endl;
            return;
        }

        mp[sn]--;
        if (mp[sn] == 0) {
            hou += v[sn];
            a[sn] = 0;
            segTree.update(sn, -v[sn]);
        } else {
            a[sn] = v[sn];
            segTree.update(sn, v[sn]);
        }
        cur = psi;
        ll++;
    }

    int ans = c[m].first;
    for (int i = 1; i <= n; ++i) ans += a[i];
    cout << ans + hou << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int tt = 1;
    cin >> tt;
    while (tt--) solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3780kb

input:

2
3 1
3 3 3
8 1
2 2
5 2
1 2
2 1

output:

12
9

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3556kb

input:

6
3 2
2 2 2
6 1
7 1
2 2
3 3
2 1
6 2
2 3
2 2
5 1
7 2
9 1
2 2
3 3
2 1
6 2
1 1
999999999
1000000000 1
1 1
1000000000
1000000000 1

output:

10
9
11
9
999999999
2000000000

result:

wrong answer 1st lines differ - expected: '9', found: '10'