답안 #347670

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
347670 2021-01-13T10:15:28 Z jesus_coconut Meteors (POI11_met) C++17
0 / 100
188 ms 26988 KB
#include <bits/stdc++.h>

using namespace std;

using ull = unsigned long long;

struct st{
    int l, r;
    ull x;
};

template<class T>
struct BIT{
    vector<T> bit;

    BIT(int N) : bit(N, 0) {}

    void add(int pos, T val) {
        for (; pos < (int) bit.size(); pos += pos & -pos) {
            bit[pos] += val;
        }
    }

    T sum(int r) {
        T res{};
        for (; r > 0; r -= r & -r) {
            res += bit[r];
        }
        return res;
    }

    T sum(int l, int r) { return sum(r) - sum(l - 1); }
};

vector<int> sol;

BIT<ull> bit(1);

vector<vector<int>> own;
vector<ull> v;
vector<st> q;

void add(int i, int p) {
    if (q[i].l <= q[i].r) {
        bit.add(q[i].l, q[i].x * p);
        bit.add(q[i].r + 1, -q[i].x * p);
    } else {
        bit.add(1, q[i].x * p);
        bit.add(q[i].r + 1, -q[i].x * p);
        bit.add(q[i].l, q[i].x * p);
    }
}

void solve(int lo, int hi, vector<int> const &ind) {
    if (lo == hi - 1) {
        vector<int> l, r;
        add(lo, 1);
        for (int i : ind) {
            ull suma = 0;
            for (int a : own[i]) {
                suma += bit.sum(a);
                if (suma >= v[i]) break;
            }
            if (suma >= v[i]) {
                l.push_back(i);
            } else r.push_back(i);
        }
        add(lo, -1);
        for (int i : l) {
            sol[i] = lo;
        }
        for (int i : r) {
            sol[i] = lo + 1;
        }
        return;
    }

    int mid = (lo + hi) / 2;
    for (int i = lo; i < mid; ++i) {
        add(i, 1);
    }

    vector<int> l, r;

    for (int i : ind) {
        ull suma = 0;
        for (int a : own[i]) {
            suma += bit.sum(a);
            if (suma >= v[i]) break;
        }
        if (suma >= v[i]) {
            l.push_back(i);
        } else r.push_back(i);
    }

    solve(mid, hi, r);
    for (int i = lo; i < mid; ++i) {
        add(i, -1);
    }
    solve(lo, mid, l);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;
    bit.bit.resize(n + 10);
    sol.resize(n);
    own.resize(n);
    for (int i = 1; i <= m; ++i) {
        ull a;
        cin >> a;
        --a;
        own[a].push_back(i);
    }
    v.resize(n);
    for (auto &a : v) cin >> a;
    int k;
    cin >> k;
    q.resize(k);
    for (int i = 0; i < k; ++i) {
        cin >> q[i].l >> q[i].r >> q[i].x;
    }
    vector<int> tmp(n);
    iota(begin(tmp), end(tmp), 0);
    solve(0, k, tmp);

    for (auto a : sol) {
        if (a == k) {
            cout << "NIE\n";
        } else cout << a + 1 << '\n';
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 364 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 31 ms 2028 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 49 ms 2540 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 44 ms 2116 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 32 ms 1388 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 188 ms 26988 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 179 ms 25340 KB Execution killed with signal 7 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -