Submission #13702

#TimeUsernameProblemLanguageResultExecution timeMemory
13702eaststar케이크 (JOI13_cake)C++98
100 / 100
159 ms23004 KiB
#include <stdio.h>
#include <algorithm>
using namespace std;
int a[300010],t[300010][2],st[300010],p;
long long b[2][300010],ans[300010];
void trav(int n,int s,int e){
    int i=s,j=e,l=t[n][0],r=t[n][1];
    long long sum=a[n];
    if(s==e)ans[n]+=sum,ans[n+1]-=sum;
    if(s>=e)return;
    while(l||r){
        if(a[l]<a[r])sum+=b[j%2][l]-b[j%2][i-1],i=l+1,l=t[l][1];
        else sum+=b[i%2][j]-b[i%2][r-1],j=r-1,r=t[r][0];
    }
    ans[n]+=sum,ans[n+1]-=sum;
    sum=b[s%2][e]-b[s%2][n-1];
    ans[s]+=sum,ans[n]-=sum;
    sum=b[e%2][n]-b[e%2][s-1];
    ans[n+1]+=sum,ans[e+1]-=sum;
    if(t[n][0])trav(t[n][0],s,n-1);
    if(t[n][1])trav(t[n][1],n+1,e);
}
int main(){
    int i,n,mn=2e9,mi,l=1,r,chk=0;
    long long s=0;
    scanf("%d",&n);
    for(i=1;i<=n;++i){
        scanf("%d",a+i);
        if(mn>a[i])mn=a[i],mi=i;
    }
    rotate(a+1,a+mi%n+1,a+n+1);
    r=n-1;
    while(l<=r){
        if(a[l]<a[r])s+=chk*a[r--];
        else s+=chk*a[l++];
        chk=!chk;
    }
    ans[n]=s;
    b[1][1]=b[1][2]=a[1];
    for(i=2;i<=n;++i)b[i%2][i+1]=b[i%2][i]=b[i%2][i-2]+a[i];
    for(i=1;i<n;++i){
        while(p&&a[st[p]]>a[i])--p;
        t[i][0]=t[st[p]][1],t[st[p]][1]=i,st[++p]=i;
    }
    a[0]=2e9;
    trav(st[1],1,n-1);
    s=0;
    if(n%2)ans[1]+=a[n];
    for(i=2;i<=n;++i)ans[i]+=ans[i-1];
    if(n%2==0)ans[n]+=a[n];
    rotate(ans+1,ans+n-mi+1,ans+n+1);
    for(i=1;i<=n;++i)printf("%lld\n",ans[i]);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...