Submission #1281539

#TimeUsernameProblemLanguageResultExecution timeMemory
1281539nanj0178새로운 문제 (POI11_met)C++20
100 / 100
811 ms32972 KiB
#include <bitset>
#include<iostream>
// #include<fstream>
#include<vector>
#include<array>
#include<algorithm>
#include<set>
#include<cmath>
#include<unordered_map>
#include<iomanip>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#include <climits>
#include <chrono>
#include <random>
#include <cassert>
using namespace std;
#define PRINTARRAY(st, en, a) for(int _i = st; _i <= en; _i++) {cout << a[_i] << (_i != en ? " " : "\n");}
#define SZ(A) (int)A.size()
using LL = long long;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int MAXK = 300000;
const int INF = 1e9;
void bit_update(int x, int v, vector<LL> &bit) {
    for(; x <= MAXK; x += x & -x) {
        bit[x] += v;
    }
}
LL bit_query(int x, vector<LL> &bit) {
    LL sum = 0;
    for(; x > 0; x -= x & -x) {
        sum += bit[x];
    }
    return sum;
}
void solve() {
    int n, m;
    cin >> n >> m;
    MAXK = m + 1;
    vector<int> station(m + 1, 0);
    vector<int> target(n + 1, 0);
    vector<vector<int>> stationList(n + 1);
    for(int i = 1; i <= m; i++) {
        cin >> station[i];
        stationList[station[i]].push_back(i);
    }
    for(int i = 1; i <= n; i++) {
        cin >> target[i];
    }
    int k;
    cin >> k;
    vector<array<int,3>> meteor(k + 1, {0,0,0});
    for(int i = 1; i <= k; i++) {
        cin >> meteor[i][0] >> meteor[i][1] >> meteor[i][2];
    }
    queue<tuple<int, int, vector<int>>> q;
    {
        vector<int> list;
        for(int i = 1; i <= n; i++) {
            list.push_back(i);
        }
        q.push({1, k + 1, list});
    }
    vector<LL> bit(m + 2, 0);
    int ptr = 0;
    vector<int> ans(n + 1, 0);
    while(!q.empty()) {
        auto [l, r, list] = q.front(); q.pop();
        // cout << l << " " << r << endl;
        if (l == r) {
            for(auto v : list) {
                ans[v] = l;
            }
            continue;
        }
        int mid = l + (r - l) / 2;
        if (ptr > mid) {
            ptr = 0;
            bit.assign(m + 2, 0);
        }
        while(ptr < mid) {
            auto [l, r, t] = meteor[ptr + 1];
            ptr++;
            bit_update(l, t, bit);
            bit_update(r + 1, -t, bit);
            if (l > r) {
                bit_update(1, t, bit);
                bit_update(m + 1, -t, bit);
            }
        }
        vector<int> small;
        vector<int> bigger;
        for(auto v : list) {
            LL need = target[v];
            // cout << v << " " << need << endl;
            for(auto p : stationList[v]) {
                need -= bit_query(p, bit);
                if (need <= 0) break;
                // cout << "Sub:" << bit_query(p, bit) << endl;
            }
            if (need <= 0) {
                small.push_back(v);
            } else {
                bigger.push_back(v);
            }
        }
        if (SZ(small) != 0) {
            q.push({l, mid, small});
        }        
        if (SZ(bigger) != 0) {
            q.push({mid + 1, r, bigger});
        }
    }
    for(int i = 1; i <= n; i++) {
        if (ans[i] != k + 1) {
            cout << ans[i] << "\n";
        } else {
            cout << "NIE" << "\n";
        }
    }
}
    
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(false);
    int testcase = 1;
    // cin >> testcase;
    while(testcase--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...