제출 #1301991

#제출 시각아이디문제언어결과실행 시간메모리
1301991loomTricks of the Trade (CEOI23_trade)C++20
100 / 100
2977 ms41924 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define inf (int)2e18 #define nl '\n' const int N = 250005; int k, cl, cr, sum, ans = -inf; int c[N], s[N], opt[N], omx[N]; multiset<int> in, out; void add(int i){ sum -= c[i]; int x = s[i]; auto it = in.begin(); if(in.size() < k){ in.insert(x); sum += x; } else if(x > *it){ sum -= *it; out.insert(*it); in.erase(it); in.insert(x); sum += x; } else{ out.insert(x); } } void del(int i){ sum += c[i]; int x = s[i]; if(out.find(x) != out.end()){ out.erase(out.find(x)); } else{ in.erase(in.find(x)); sum -= x; if(!out.empty()){ auto it = prev(out.end()); sum += *it; in.insert(*it); out.erase(it); } } } void seg(int l, int r){ while(cl < l){ del(cl); cl++; if(cl > cr){ cr++; add(cr); } } while(cl > l){ cl--; add(cl); } while(cr < r){ cr++; add(cr); } while(cr > r){ del(cr); cr--; } } void solve(int l, int r, int opl, int opr){ if(l > r) return; int m = (l+r)/2; seg(m, max(m, opl)); int mx = -inf, op = opr; if(cr-m+1 >= k){ mx = sum; op = cr; } while(cr < opr){ cr++; add(cr); if(cr-m+1 >= k and mx < sum){ mx = sum; op = cr; } } ans = max(ans, mx); opt[m] = op; omx[m] = mx; solve(l, m-1, opl, op); solve(m+1, r, op, opr); } void solve(){ int n; cin>>n>>k; for(int i = 1; i <= n; i++) cin>>c[i]; for(int i = 1; i <= n; i++) cin>>s[i]; cl = 1, cr = 1; add(1); solve(1, n, 1, n); cout<<ans<<nl; sum = 0; in.clear(); out.clear(); cl = 1, cr = 1; add(1); vector<int> vc; for(int i = 1; i <= n; i++){ if(omx[i] == ans) vc.push_back(i); } vc.push_back(n); vector<int> ad[n+1], dl[n+1]; for(int i = 0; i+1 < vc.size(); i++){ int l = vc[i]; for(int r = opt[l]; r <= opt[vc[i+1]]; r++){ seg(l, r); if(sum == ans and r-l+1 >= k){ int x = *in.begin(); ad[l].push_back(x); dl[r].push_back(x); } } } multiset<int> mn; for(int i = 1; i <= n; i++){ for(int x : ad[i]) mn.insert(x); cout<<(!mn.empty() and s[i] >= *mn.begin()); for(int x : dl[i]) mn.erase(mn.find(x)); } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL);cout.tie(NULL); int t = 1; //cin>>t; while(t--) solve(); return 0; }
#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...