Submission #251066

#TimeUsernameProblemLanguageResultExecution timeMemory
251066puyu_liaoLightning Conductor (POI11_pio)C++14
100 / 100
134 ms17144 KiB
#include<bits/stdc++.h> using namespace std; #define int int64_t const int N = 500005; int h[N],ans[N]; int ftable[N]; double f2(int i,int j){ return sqrt(abs(i-j)); } int f(int i,int j){ return ftable[abs(i-j)]; } struct segment{ int i,l,r; }; void solve(int n){ vector<segment> v; v.push_back({1,1,n}); for(int i=2;i<=n;i++){ segment now; now.i = i; now.l = i; now.r = n; //cout << i << " : "; for(auto i : v) cout << i.i << ' ' << complex<int>(i.l,i.r) << ' '; cout << '\n'; while(now.l <= v.back().l && h[v.back().i] + f2(v.back().i,v.back().l) <= h[i] + f2(i,v.back().l) && h[v.back().i] + f2(v.back().i,v.back().r) <= h[i] + f2(i,v.back().r)){ v.pop_back(); } //cout << i << " : "; for(auto i : v) cout << i.i << ' ' << complex<int>(i.l,i.r) << ' '; cout << '\n'; //cout << i << " : " << h[v.back().i] + f2(v.back().i,v.back().r) << ' ' << h[i] + f2(i,v.back().r) << '\n'; if(h[v.back().i] + f2(v.back().i,v.back().r) >= h[i] + f2(i,v.back().r)) { if(v.back().r != n) v.push_back({now.i,v.back().r+1,now.r}); continue; } auto pre = v.back(); int l = max(v.back().l,now.l), r = v.back().r; //cout << i << " : " << l << ' ' << r << '\n'; while(l < r){ int m = l+r >> 1; if(h[pre.i] + f2(pre.i,m) > h[i] + f2(i,m)) l=m+1; else r = m; } now.l = l; v[v.size()-1].r = l-1; v.push_back(now); } for(auto i : v) for(int j=i.l;j<=i.r;j++) ans[j] = max(ans[j],h[i.i] + f(i.i,j)); } int32_t main(){ cin.tie(0); ios_base::sync_with_stdio(false); for(int i=1,now=1;i<N;i++){ if(now*now<i) now++; ftable[i] = now; //if(i<10)cout << i << ' ' << ftable[i] << '\n'; } int n; cin >> n; for(int i=1;i<=n;i++) cin >> h[i]; solve(n); reverse(h+1,h+n+1); reverse(ans+1,ans+n+1); solve(n); reverse(ans+1,ans+n+1); reverse(h+1,h+n+1); for(int i=1;i<=n;i++) cout << ans[i] - h[i] << '\n'; //cout << '\n'; // for(int i=1;i<=n;i++){ // int mx = 0; // for(int j=1;j<=n;j++) mx = max(mx,h[j]+f(i,j)); // cout << mx-h[i] << ' '; // }cout << '\n'; }

Compilation message (stderr)

pio.cpp: In function 'void solve(int64_t)':
pio.cpp:40:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
             int m = l+r >> 1;
                     ~^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...