제출 #1128533

#제출 시각아이디문제언어결과실행 시간메모리
1128533rasbery303새로운 문제 (POI11_met)C++20
74 / 100
1550 ms80384 KiB
#include <iostream> #include <vector> #include <cassert> using namespace std; using ll = long long int; const int maxn = 3e5+1; int n, m, k; ll tree[maxn]; vector<ll> a, p, check[maxn], own[maxn]; int ql[maxn], qr[maxn], l[maxn], r[maxn]; ll qval[maxn]; void update(int x, long long val){ while(x<=m){ tree[x]+=val; x+=(x&-x); } } long long read(int x){ long long s=0; while(x>0){ s+=tree[x]; x-=(x&-x); } return s; } void apply(int x){ if(ql[x]<=qr[x]) update(ql[x],qval[x]),update(qr[x]+1,-qval[x]); else{ update(1,qval[x]); update(qr[x]+1,-qval[x]); update(ql[x],qval[x]); } } int main(){ cin >> n >> m; a.resize(m+1), p.resize(n+1); for (int i = 1; i <= m; ++i){ int x; cin >> x; own[x].push_back(i); } for (int i = 1; i <= n; ++i) cin >> p[i]; cin >> k; for (int i = 1; i <= k; ++i) cin >> ql[i] >> qr[i] >> qval[i]; for (int i = 1; i <= n; ++i){ l[i] = 1; r[i] = k+1; } bool ok = true; while (ok){ ok = false; for (int i = 0; i <= m; ++i) tree[i] = 0; for (int i = 1; i <= n; ++i){ if (l[i]!=r[i]){ int mid = (l[i]+r[i])>>1; check[mid].push_back(i); } } for (int q = 1; q <= k; ++q){ apply(q); while(!check[q].empty()){ ok = true; int id = check[q].back(); check[q].pop_back(); ll sum = 0; for (auto sec: own[id]){ sum += read(sec); if (sum >= p[id]) break; } if (sum >= p[id]) r[id] = q; else l[id] = q+1; } } } for (int i = 1; i <= n; ++i){ assert(l[i]==r[i]); if (l[i] <= k){ cout << l[i] << '\n'; } else { cout << "NIE\n"; } } }
#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...