Submission #217814

#TimeUsernameProblemLanguageResultExecution timeMemory
217814MarcoMeijer모임들 (IOI18_meetings)C++14
36 / 100
815 ms246008 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; //macros typedef long long ll; typedef pair<int, int> ii; typedef tuple<int, int, int> iii; typedef vector<int> vi; typedef vector<ii> vii; typedef vector<iii> viii; typedef vector<ll> vll; #define REP(a,b,c) for(int a=int(b); a<int(c); a++) #define RE(a,c) REP(a,0,c) #define RE1(a,c) REP(a,1,c+1) #define REI(a,b,c) REP(a,b,c+1) #define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--) #define INF 1e9 #define pb push_back #define fi first #define se second #define sz size() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int MX=5000; ll HL[MX][MX]; ll HR[MX][MX]; vll C; int q; int n; vll minimum_cost2(vi& H, vi& L, vi& R); vll minimum_costs(vi H, vi L, vi R) { n = H.size(); q = L.size(); C.resize(q); int mx=0; RE(i,n) mx=max(mx,H[i]); if(mx <= 2) return minimum_cost2(H,L,R); RE(r,n) { ll mx=H[r]; HL[r][r] = mx; REV(l,0,r) { mx = max(mx, (ll)H[l]); HL[r][l] = HL[r][l+1]+mx; } } RE(l,n) { ll mx=H[l]; HR[l][l] = mx; REP(r,l+1,n) { mx = max(mx, (ll)H[r]); HR[l][r] = HR[l][r-1]+mx; } } RE(i,q) { ll ans=1e18; int l=L[i], r=R[i]; REP(i,l,r+1) ans = min(ans, HL[i][l]+HR[i][r]-ll(H[i])); C[i] = ans; } return C; } const int MX2=2e5; int right2[MX2], left2[MX2]; int SEG[MX2*4]; void buildSeg(int p=0, int l=0, int r=n-1) { if(l == r) { SEG[p] = l-left2[l]; return; } int m=(l+r)/2; buildSeg(p*2+1,l,m); buildSeg(p*2+2,m+1,r); SEG[p] = max(SEG[p*2+1], SEG[p*2+2]); } int getMax(int i, int j, int p=0, int l=0, int r=n-1) { if(j < i) return 0; if(j < l || i > r) return 0; if(i <= l && j >= r) return SEG[p]; int m=(l+r)/2; int a=getMax(i,j,p*2+1,l,m); int b=getMax(i,j,p*2+2,m+1,r); return max(a,b); } vll minimum_cost2(vi& H, vi& L, vi& R) { RE(i,n) { if(H[i] == 2) { left2[i] = i; } else { left2[i] = (i==0 ? -1 : left2[i-1]); } } REV(i,0,n) { if(H[i] == 2) { right2[i] = i; } else { right2[i] = (i==n-1 ? n : right2[i+1]); } } buildSeg(); RE(i,q) { int maxOnes=0; int l=L[i], r=R[i]; if(right2[l] > r) { maxOnes = r-l+1; // only ones } else { maxOnes = max(maxOnes, right2[l]-l); maxOnes = max(maxOnes, r-left2[r]); maxOnes = max(maxOnes, getMax(right2[l], left2[r])); } C[i] = maxOnes + (r-l+1-maxOnes)*2; } return C; }
#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...