Submission #1281521

#TimeUsernameProblemLanguageResultExecution timeMemory
1281521nanj0178Meteors (POI11_met)C++20
74 / 100
573 ms16108 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) { int 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); // 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...