萌新求救,WA 3 6 9 10
查看原帖
萌新求救,WA 3 6 9 10
194093
天梦楼主2021/7/3 17:22

代码:

#include<bits/stdc++.h>
#define dd double
#define ld long double
#define ll long long
#define uint unsigned int
#define ull unsigned long long
#define N 500010
#define M number
using namespace std;

const int INF=0x3f3f3f3f;

template<typename T> inline void read(T &x) {
    x=0; int f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c == '-') f=-f;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    x*=f;
}

template<typename T> inline T Max(T a,T b){
    return a>b?a:b;
}

struct node{
    int k,l,r;
    inline node(){}
    inline node(int k,int l,int r) : k(k),l(l),r(r) {}
};
node q[N];

int n,a[N],l,r;
dd f[N],sqr[N];

inline dd calc(int id,int k){
    // printf("id:%d,k:%d\n",id,k);
    // if(id<k) return a[k];
    return (dd)a[k]+sqr[id-k];
}

inline int erfen(int k,int l,int r){
    while(l<r){
        int mid=(l+r)>>1;
        if(calc(mid,q[r].k)>calc(mid,k)) l=mid+1;
        else r=mid;
    }
    return l;
}

inline void insert(int k){
    if(l==r) q[++r]=node(k,1,n);
    int pos;
    while(l<r&&q[r].l>=k&&calc(q[r].l,q[r].k)<calc(q[r].l,k)){
        // printf("1:%lf 2:%lf",calc(q[r].l,q[r].k),calc(q[r].l,k));
        r--;
    }
    if(q[r].r>=k&&calc(q[r].r,q[r].k)>calc(q[r].r,k)){
        if(q[r].r!=n) pos=q[r].r+1;
        else return;
    }
    else pos=erfen(k,Max(q[r].l,k),q[r].r);
    q[r].r=pos-1;q[++r]=node(k,pos,n);
}

inline void solve(int e){
    l=r=0;insert(1);
    for(int i=1;i<=n;i++){
        // if(e==2) printf("q[l+1].r:%d\n",q[l+1].r);
        if(l<r&&q[l+1].r<=i-1) l++;
        else q[l+1].l=i;
        if(l<r){
            int k=q[l+1].k;
            // if(e==2) printf("zhuangyi:i:%d k:%d\n",i,k);
            f[i]=Max(f[i],calc(i,k));
        }
        if(i!=n) insert(i+1);
    }
}

int main(){
    // freopen("my.in","r",stdin);
    // freopen("my.out","w",stdout);
    scanf("%d",&n);
    // printf("n:%d\n",n);
    for(int i=1;i<=n;i++) {scanf("%d",&a[i]);sqr[i]=sqrt(i);} 
    solve(1);
    // for(int i=1;i<=n;i++) printf("%d\n",(int)ceil(f[i])-a[i]);
    // printf("\n");
    reverse(a+1,a+n+1);reverse(f+1,f+n+1);
    // printf("n:%d\n",n);
    solve(2);
    for(int i=n;i>=1;i--) printf("%d\n",(int)ceil(f[i])-a[i]);
    return 0;
}
2021/7/3 17:22
加载中...