cjb-poi2011lightningconductor

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#define rep(i,n) for(int i=1;i<=n;i++)
#define mp make_pair
#define pb push_back
using namespace std;
#define N 500010
double f[N],g[N];
int n;
int a[N];
void work(int l,int r,int fl,int fr,double* f)
{
    if (l>r)return;
    int mid=(l+r)/2,p=fl;
    f[mid]=0;
    for(int i=fl;i<=fr;i++)
    {
        if (i>mid)break;
        double t=a[i]-a[mid]+sqrt(mid-i);
        if (t>=f[mid])f[mid]=t,p=i;
    }
    work(l,mid-1,fl,p,f);
    work(mid+1,r,p,fr,f);
}
int main()
{
    cin>>n;
    rep(i,n)scanf("%d",&a[i]);
    work(1,n,1,n,f);
    reverse(a+1,a+n+1);
    work(1,n,1,n,g);
    rep(i,n)printf("%d\n",(int)ceil(max(f[i],g[n-i+1])));
    return 0;
}
}}}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#define rep(i,n) for(int i=1;i<=n;i++)
#define mp make_pair
#define pb push_back
using namespace std;
#define N 500010
double f[N],g[N];
int n;
int a[N];
void work(int l,int r,int fl,int fr,double* f)
{
    if (l>r)return;
    int mid=(l+r)/2,p=fl;
    f[mid]=0;
    for(int i=fl;i<=fr;i++)
    {
        if (i>mid)break;
        double t=a[i]-a[mid]+sqrt(mid-i);
        if (t>=f[mid])f[mid]=t,p=i;
    }
    work(l,mid-1,fl,p,f);
    work(mid+1,r,p,fr,f);
}
int main()
{
    cin>>n;
    rep(i,n)scanf("%d",&a[i]);
    work(1,n,1,n,f);
    reverse(a+1,a+n+1);
    work(1,n,1,n,g);
    rep(i,n)printf("%d\n",(int)ceil(max(f[i],g[n-i+1])));
    return 0;
}