답안 #914278

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
914278 2024-01-21T13:51:33 Z VMaksimoski008 Meteors (POI11_met) C++14
74 / 100
130 ms 65536 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int i, it;

struct BIT {
    int n, n2;
    vector<int> tree, val;

    void config(int _n) {
        n = _n + 10;
        n2 = _n;
        tree.resize(_n+60);
        val.resize(_n+60);
    }

    void add(int p, int v) {
        val[p] += v;
        for(p++; p<n; p+=p&-p) tree[p] += v;
    }

    int query(int p) {
        int ans = 0;
        for(p++; p>0; p-=p&-p) ans += tree[p];
        return ans;
    }

	int sum(int l, int r) { return query(r) - query(l-1); }
    void set(int p, int v) { add(p, v - val[p]); }
    
    void clear() {
        for(int &x : tree) x = 0;
        for(int &x : val) x = 0;
    }
};

struct Query { int l, r, x; };

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;

    vector<vector<int> > owner(n+5);
    for(i=1; i<=m; i++) {
        int x;
        cin >> x;
        owner[x].push_back(i);
    }

    vector<int> req(n+5);
    for(i=1; i<=n; i++) cin >> req[i];

    int k;
    cin >> k;
    vector<Query> qus(k+5);
    for(i=1; i<=k; i++)
        cin >> qus[i].l >> qus[i].r >> qus[i].x;

    vector<int> L(n+5, 1), R(n+5, k+1);
    bool changed = true;

    BIT bit;
    bit.config(m+1);
    vector<stack<int> > to_check(k+5);
    Query q;
    while(changed) {
        changed = false;

        bit.clear();

        for(i=1; i<=n; i++)
            if(L[i] != R[i]) to_check[(L[i]+R[i])/2].push(i);

        for(it=1; it<=k; it++) {
            q = qus[it];

            if(q.l <= q.r) {
                bit.add(q.l, q.x);
                bit.add(q.r+1, -q.x);
            } else {
                bit.add(q.l, q.x);
                bit.add(m+1, -q.x);

                bit.add(1, q.x);
                bit.add(q.r+1, -q.x);
            }

            while(!to_check[it].empty()) {
                changed = true;

                int u = to_check[it].top();
                to_check[it].pop();

                ll total = 0;
                for(int &x : owner[u]) {
                    total += bit.query(x);
                    if(total > req[u]) break;
                }

                if(total >= req[u]) R[u] = it;
                else L[u] = it + 1;
            }
        }
    }

    for(i=1; i<=n; i++) {
        if(L[i] <= k) cout << L[i] << '\n';
        else cout << "NIE\n";
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1116 KB Output is correct
2 Correct 1 ms 1116 KB Output is correct
3 Correct 2 ms 1116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1116 KB Output is correct
2 Correct 1 ms 1116 KB Output is correct
3 Correct 2 ms 1184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 66 ms 35588 KB Output is correct
2 Correct 102 ms 36844 KB Output is correct
3 Correct 105 ms 36228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 92 ms 35848 KB Output is correct
2 Correct 96 ms 35892 KB Output is correct
3 Correct 124 ms 36820 KB Output is correct
4 Correct 23 ms 5468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 72 ms 35152 KB Output is correct
2 Correct 86 ms 36692 KB Output is correct
3 Correct 55 ms 34648 KB Output is correct
4 Correct 100 ms 36432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 35152 KB Output is correct
2 Correct 99 ms 35912 KB Output is correct
3 Correct 74 ms 35412 KB Output is correct
4 Correct 125 ms 37172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 127 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 130 ms 65536 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -