제출 #1172670

#제출 시각아이디문제언어결과실행 시간메모리
1172670nguyenkhangninh99Art Exhibition (JOI18_art)C++20
0 / 100
58 ms117824 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") using namespace std; #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); #define FOR(i,l,r) for(int i=l;i<=r;i++) #define FOD(i,r,l) for(int i=r;i>=l;i--) #define ii pair<int,int> #define fi first #define se second #define pb push_back const int N = (int)5e6+10; ii a[N]; int n; namespace sub4 { int preMin[N],preMax[N],sufMin[N],sufMax[N],par[N]; ii pos[N]; int L[N]; vector<ii> q[N]; int acs(int &u) { return (par[u] < 0 ? u : par[u] = acs(par[u])); } void solve(void) { preMin[0] = sufMin[n+1] = 1e9; preMax[0] = sufMax[n+1] = -1e9; FOR(i,1,n) { preMin[i] = min(preMin[i-1],a[i].se); preMax[i] = max(preMax[i-1],a[i].se); } FOD(i,n,1) { sufMin[i] = min(sufMin[i+1],a[i].se); sufMax[i] = max(sufMax[i+1],a[i].se); } int i = 1, j = 0, j2 = 0, ans = 1e9; while (i <= n) { while (j < n and preMax[j+1] <= sufMax[i+1]) ++j; while (j2 < n and preMin[j2+1] >= sufMin[i+1]) ++j2; while (j and preMax[j] > sufMax[i+1]) --j; while (j2 and preMin[j2] < sufMin[i+1]) --j2; pos[i] = {j,j2}; i++; } FOR(k,0,3) { FOR(i,1,n) par[i] = -1; FOR(i,1,n) { if (!k) L[i] = (i > 1?-a[i].fi+preMax[i-1]-preMin[i-1]:1e9); if (k == 1) L[i] = (i < n?-a[i].fi:1e9); if (k == 2) L[i] = (i > 1 and i < n?-a[i].fi+preMax[i-1]:1e9); if (k == 3) L[i] = (i > 1 and i < n?-a[i].fi-preMin[i-1]:1e9); int j = pos[i].fi, j2 = pos[i].se; int pos1 = max(j,j2)+2, pos2 = min(j,j2)+1; if (!k and pos1 <= i and i > 1) q[i].pb({pos1,i}); if (k == 1 and pos2 and i < n) q[pos2].pb({1,i}); if (k == 2 and i > 1 and i < n and j+2 <= min(j2+1,i)) q[min(j2+1,i)].pb({j+2,i}); if (k == 3 and i > 1 and i < n and j2+2 <= min(j+1,i)) q[min(j+1,i)].pb({j2+2,i}); } stack<int> st; FOR(i,1,n) { while (!st.empty() and L[st.top()] > L[i]) { par[st.top()] = i; st.pop(); } st.push(i); for (auto x : q[i]) { int sum = 0; if (k == 1) sum = sufMax[x.se+1]-sufMin[x.se+1]; if (k == 2) sum = -sufMin[x.se+1]; if (k == 3) sum = sufMax[x.se+1]; // cout << sum << " " << L[acs(x.fi)] << endl; ans = min(ans, sum+L[acs(x.fi)]+a[x.se].fi); } q[i].clear(); } } cout << ans; } } signed main(){ fast; cin >> n; FOR(i,1,n) cin >> a[i].fi >> a[i].se; sub4::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...