题解 P5078 【Tweetuzki 爱军训】
Space_Gold_Trash · · 题解
题目连接
体验++
我们首先从确定算法着手
根据常识,我们可以选择的有
同样根据常识
那么我们用结合律搞一下,不就是减去
那么加一个前缀和优化一波
然后我们再用指针乱搞一下排名
就AC啦~
#include<bits/stdc++.h>
#define N 1001001
#define int unsigned long long
using namespace std;
inline int read( ){
int sum=0,ft=1;
char ch=getchar( );
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar( );
if(ch=='-'){
ch=getchar( );
ft=-1;
}
while(ch>='0'&&ch<='9'){
sum=ch-'0'+(sum<<3)+(sum<<1);
ch=getchar( );
}
return ft*sum;
}
inline void print(int k){
if(!k)return;
print(k/10);
putchar(k%10+'0');
}
int sum[N],n,a[N],pre[N],nex[N],last,xu[N];
inline void work(int k){
nex[last]=k;
pre[nex[k]]=pre[k];
nex[pre[k]]=nex[k];
nex[k]=0;
pre[k]=last;
last=k;
}
signed main( ){
n=read( );
int i,j,ans=0,k;
for(i=1;i<=n;i++){
nex[i]=i+1;
pre[i]=i-1;
k=read( );
sum[i]=k;
a[i]=k;
ans=ans+k*i;
}
last=n;
nex[n]=0;
for(i=n-1;i>=1;i--)sum[i]+=sum[i+1];
for(i=n;i>=1;i--)
if((n-i)*a[i]>sum[i+1]){
ans+=(n-i)*a[i]-sum[i+1];
work(i);
}
print(ans);
putchar('\n');
int ci=0,t;
for(i=1;i<=n;i++)
if(!pre[i]){
t=i;
break;
}
while(t){
xu[++ci]=t;
t=nex[t];
}
for(i=1;i<=n;i++){
if(a[xu[i]])print(a[xu[i]]);
else putchar('0');
putchar(' ');
}
}