Submission #942080

#TimeUsernameProblemLanguageResultExecution timeMemory
942080dsyzSnowball (JOI21_ho_t2)C++17
33 / 100
2574 ms4024 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define MAXN (1000005) int main() { ios_base::sync_with_stdio(false);cin.tie(0); ll N,Q; cin>>N>>Q; set<pair<ll,ll> > s; //stores ranges of 1s s.insert({-1e18,1e18}); ll X[N]; for(ll i = 0;i < N;i++){ cin>>X[i]; } ll ans[N]; memset(ans,0,sizeof(ans)); ll wind[Q]; for(ll q = 0;q < Q;q++){ cin>>wind[q]; if(wind[q] > 0){ //blow right for(ll i = N - 1;i >= 0;i--){ ll Lb = X[i], Rb = X[i] + wind[q] - 1; auto it = s.lower_bound({Lb,Rb}); if(it != s.begin()){ auto it2 = it; it2--; if(it2->second >= Rb){ pair<ll,ll> tmp = *it2; s.erase(it2); if(tmp.first < Lb) s.insert({tmp.first,Lb - 1}); if(Rb < tmp.second) s.insert({Rb + 1,tmp.second}); ans[i] += (Rb - Lb + 1); }else if(it2->second >= Lb){ pair<ll,ll> tmp = *it2; s.erase(it2); s.insert({tmp.first,Lb - 1}); ans[i] += (tmp.second - Lb + 1); } } while(it != s.end() && it->first <= Rb){ pair<ll,ll> tmp = *it; ans[i] += (min(Rb,it->second) - max(Lb,it->first) + 1); auto it2 = it; it++; s.erase(it2); if(tmp.first < Lb) s.insert({tmp.first,Lb - 1}); if(tmp.second > Rb) s.insert({Rb + 1,tmp.second}); } X[i] += wind[q]; } }else if(wind[q] < 0){ //blow left wind[q] *= -1; for(ll i = 0;i < N;i++){ ll Lb = X[i] - wind[q], Rb = X[i] - 1; auto it = s.lower_bound({Lb,Rb}); if(it != s.begin()){ auto it2 = it; it2--; if(it2->second >= Rb){ pair<ll,ll> tmp = *it2; s.erase(it2); if(tmp.first < Lb) s.insert({tmp.first,Lb - 1}); if(Rb < tmp.second) s.insert({Rb + 1,tmp.second}); ans[i] += (Rb - Lb + 1); }else if(it2->second >= Lb){ pair<ll,ll> tmp = *it2; s.erase(it2); s.insert({tmp.first,Lb - 1}); ans[i] += (tmp.second - Lb + 1); } } while(it != s.end() && it->first <= Rb){ pair<ll,ll> tmp = *it; ans[i] += (min(Rb,it->second) - max(Lb,it->first) + 1); auto it2 = it; it++; s.erase(it2); if(tmp.first < Lb) s.insert({tmp.first,Lb - 1}); if(tmp.second > Rb) s.insert({Rb + 1,tmp.second}); } X[i] -= wind[q]; } } } for(ll i = 0;i < N;i++){ cout<<ans[i]<<'\n'; } cout<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...