제출 #1239418

#제출 시각아이디문제언어결과실행 시간메모리
1239418_llColouring a rectangle (eJOI19_colouring)C++20
0 / 100
722 ms54024 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; void prop(vector<array<ll, 2>> &ls, ll at, ll atl, ll atr){ if(!ls[at][0]) return; ls[at][1] += ls[at][0] * (atr - atl + 1); if(atl != atr) ls[2 * at][0] += ls[at][0], ls[2 * at + 1][0] += ls[at][0]; ls[at][0] = 0; } void up(vector<array<ll, 2>> &ls, ll at, ll atl, ll atr, ll lq, ll rq, ll vl){ prop(ls, at, atl, atr); if(rq < atl || atr < lq) return; if(lq <= atl && atr <= rq){ ls[at][0] = vl; prop(ls, at, atl, atr); return; } ll m = (atl + atr) / 2; up(ls, 2 * at, atl, m, lq, rq, vl), up(ls, 2 * at + 1, m + 1, atr, lq, rq, vl); ls[at][1] = min(ls[2 * at][1], ls[2 * at + 1][1]); } ll qr(vector<array<ll, 2>> &ls, ll at, ll atl, ll atr, ll lq, ll rq){ prop(ls, at, atl, atr); if(rq < atl || atr < lq) return 1e16; if(lq <= atl && atr <= rq) return ls[at][1]; ll m = (atl + atr) / 2, r1 = qr(ls, 2 * at, atl, m, lq, rq); return min(r1, qr(ls, 2 * at + 1, m + 1, atr, lq, rq)); } ll sol(vector<ll> a, vector<array<ll, 3>> b){ ll sz = a.size() + 1; vector<ll> dp(sz); // seg com lazy vector<vector<array<ll, 2>>> sl(sz + 1); // 1 indexado e um espaco a mais pra não dar segfal vector<array<ll, 2>> ls(4 * sz, {0, 0}); for(ll i = 0; i < sz - 2; i++){ // pro sweep line sl[b[i][0]].push_back({-1, i}); sl[b[i][1] + 1].push_back({1, i}); } ll s = 0; for(ll i = 1; 1; i++){ for(auto [j, k] : sl[i]){ up(ls, 1, 0, sz, b[k][0], b[k][1], j * b[k][2]); s -= j * b[k][2]; } if(i == sz - 1) break; ll vl = qr(ls, 1, 0, sz, 0, i - 1); dp[i] = s + vl; up(ls, 1, 0, sz, 0, i - 1, a[i]); // aviso pro proximo que posso não ligar nenhum up(ls, 1, 0, sz, i, i, dp[i]); } ll re = 1e16; for(ll i = 0; i < sz - 1; i++) re = min(re, qr(ls, 1, 0, sz, i, i)); return re; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n, m; cin >> n >> m; vector<array<ll, 3>> b, p; vector<ll> b2 = {-1}, p2 = b2; for(ll i = 1, vl, l = m, r = m, dl = -1, dr = 1; i <= n + m - 1; i++, l += dl, r += dr){ cin >> vl; if(i % 2) b.push_back({(l + 1) / 2, (r + 1) / 2, vl}); else p.push_back({(l + 1) / 2, (r + 1) / 2, vl}); if(l == 1) dl = 1; if(r == n + m - 1) dr = -1; } for(ll i = 1, vl; i <= n + m - 1; i++){ cin >> vl; if(i % 2 == m % 2) b2.push_back(vl); else p2.push_back(vl); } cout << sol(b2, b) + sol(p2, p) << "\n"; // esboco, termino amanha ta muito errado }
#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...