Submission #42750

#TimeUsernameProblemLanguageResultExecution timeMemory
42750yusufakeAncient Books (IOI17_books)C++98
70 / 100
2061 ms161440 KiB
#include<bits/stdc++.h> using namespace std; #define _ int v, int tl, int tr, int l, int r #define tm (tl+tr >> 1) #define sol v+v,tl,tm,l,r #define sag v+v+1,tm+1,tr,l,r #define mp make_pair #define pb push_back #define st first #define nd second typedef long long ll; typedef pair < ll , ll > pp; const int mod = 1e9 + 7; const int N = 1e6 + 6; set < int > W[N]; int H[N],T[N],n,i,j,l,r,t,a,b,mn,mx,u,h; int smn[N<<2],smx[N<<2]; ll x; void up(int p) { // set value at position p for (smn[p += n] = a, smx[p] = b; p > 1; p >>= 1){ smn[p>>1] = min(smn[p] , smn[p^1]); smx[p>>1] = max(smx[p] , smx[p^1]); } } void qry(int l, int r) { // sum on interval [l, r) r++; for (l += n, r += n; l < r; l >>= 1, r >>= 1) { if (l&1) { mn = min(mn , smn[l]); mx = max(mx , smx[l]); l++; } if (r&1) { r--; mn = min(mn , smn[r]); mx = max(mx , smx[r]); } } } ll minimum_walk(vector < int > p, int s){ x = 0; n = p.size(); // if(n > 1000) return 0; memset(smn , 22 , sizeof smn); for(i=0;i<n;i++){ x += abs(p[i] - i); if(H[i]) continue; r = i; for(j=i; !H[j] ; j = p[j]){ H[j] = 1; r = max(r , j); } for(j=i; !T[j] ; j = p[j]){ T[j] = 1; a = i; b = r; up(j); } } for(i=0;i<n && p[i] == i; i++); for(j=n-1;j>=0 && p[j] == j; j--); queue < pair < int , pp > > Q[2]; Q[h=0].push(mp(0,mp(s,s))); for(;;){ if(Q[h].size() == 0) h = !h; l = Q[h].front().nd.st; r = Q[h].front().nd.nd; u = Q[h].front().st; Q[h].pop(); if(W[l].find(r) != W[l].end()) continue; // cout << l << " " << r << " " << -u << " aa\n"; if(l <= i && r >= j) return x + -u-u; W[l].insert(r); mn = n; mx = 0; qry(l,r); Q[h].push(mp(u,mp(mn,mx))); if(l) Q[!h].push(mp(u-1,mp(l-1,r))); if(r < n-1) Q[!h].push(mp(u-1,mp(l,r+1))); } } /* int main(){ cout << minimum_walk({1,0,2,3} , 2); }*/
#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...