제출 #1237297

#제출 시각아이디문제언어결과실행 시간메모리
1237297mychecksedad모임들 (IOI18_meetings)C++20
0 / 100
205 ms240988 KiB
#include "meetings.h" #include<bits/stdc++.h> using namespace std; #define pb push_back #define vi vector<int> #define ff first #define ss second #define ll long long int #define pii pair<int,int> const int N = 1e5+100, M = 5010, K = 22; int rmq[N][K], dp[N][K], pd[N][K], lp[N][K], rp[N][K]; ll pref[M][M]; int get(int l, int r){ int k = __lg(r-l+1); return max(rmq[l][k], rmq[r-(1<<k)+1][k]); } std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) { int n = H.size(); int q = L.size(); for(int i = 0; i < n; ++i) rmq[i+1][0] = H[i]; for(int j = 1; j < K; ++j){ for(int i = 1; i + (1<<j) <= n + 1; ++i){ rmq[i][j] = max(rmq[i][j-1], rmq[i+(1<<(j-1))][j-1]); } } for(int i = 1; i <= n; ++i){ pref[i][0] = 0; for(int j = 1; j <= n; ++j) pref[i][j] = pref[i][j - 1] + (i <= j ? get(i, j) : get(j, i)); } for(int i = 0; i < q; ++i) L[i]++, R[i]++; vector<ll> C; // if(n <= 5000 && q <= 5000){ // for(int _ = 0; _ < q; ++_){ // ll ans = 1e18; // for(int i = L[_]; i <= R[_]; ++i){ // ll cur = pref[i][R[_]] - pref[i][L[_] - 1]; // // for(int j = L[_]; j <= R[_]; ++j){ // // if(i<=j) cur += get(i, j); // // else cur += get(j,i); // // } // ans=min(ans,cur); // } // C.pb(ans); // } // return C; // } vector<ll> h(n+1); for(int i = 1; i <= n; ++i){ h[i] = H[i-1]; } for(int d = 1; d <= 20; ++d){ dp[0][d] = 0; int j = 0, j2 = 0; for(int i = 1; i <= n; ++i){ if(h[i] > d){ lp[i][d] = i + 1; dp[i][d] = 0; j2 = i; j = i; }else if(h[i] == d){ if(i == 1 || h[i-1] > d){ dp[i][d] = d; }else{ dp[i][d] = min((lp[i-1][d]-j2)*d + d + dp[i-1][d], (i-j)*d + dp[j][d]); // takes it all } j = i; lp[i][d] = i; }else{ lp[i][d] = j; dp[i][d] = min(j == 0 ? i * d : dp[j-1][d] + d*(i-j+1), dp[i][d-1] + dp[j][d]); } // cerr << dp[i][d] << ' '; } // cerr << '\n'; } for(int d = 1; d <= 20; ++d){ pd[n + 1][d] = 0; int j = n + 1, j2 = n+1; for(int i = n; i >= 1; --i){ if(h[i] > d){ rp[i][d] = i - 1; pd[i][d] = 0; j2 = i; j = i; }else if(h[i] == d){ if(i == n || h[i + 1] > d){ pd[i][d] = d; }else{ pd[i][d] = min((j2-rp[i+1][d])*d + d + pd[i+1][d], (j-i)*d + pd[j][d]); } rp[i][d] = i; j = i; }else{ rp[i][d] = j; pd[i][d] = min(j == n+1 ? (n-i+1) * d : pd[j+1][d] + d*(j-i+1), pd[i][d-1] + pd[j][d]); } // cerr << pd[i][d] << ' ' << rp[i][d] << '\n'; } // cerr << '\n'; } for(int j = 0; j < q; ++j){ int ans = 1e9; int l = L[j], r = R[j]; int mx = get(l, r); if(mx==1){ C.pb(r-l+1); continue; } ans = min({mx * (r-l+1), pd[l][mx-1] + (r-rp[l][mx]+1) * mx, dp[r][mx-1] + (lp[r][mx]-l+1) * mx}); int cnt = 0; for(int i = l; i <= r; ++i){ if(h[i] == mx){ ++cnt; if(cnt > 1 && i > l){ ans = min(ans, dp[i-1][mx-1] + (r-i+1 + lp[i-1][mx]-l+1)*mx); } } } C.pb(ans); } 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...