Codeforces Round 983 (Div. 2) 小结
<Dashboard - Codeforces Round 983 (Div. 2) - Codeforces>
这场瑕疵非常多,绝对不仅于能力问题,因此非常需要总结。
首先在 \(B\) 吃了一个罚时,原因竟是某个换行符丢了。
然后在 \(C\) 又吃了一个罚时,原因是太想当然了?
在此耽误了一些时间。
但总的还可以接受,\(26\) \(min\) 过完前三题。
对于题 \(D\) ,其实也是对某些题意进行了误审,遗漏。
忽视了最关键的一条 \(:\) 父亲的编号大小是单调递增的。
文章便也因此而来。
不仅因此吃了一罚,而且还耽误了 \(15\) \(min\) 左右。
当然,最关键的问题还是在 \(E\) 。
其实一开始我就发现了是解方程,并且会解。
但我在解第二次时又想当然了。
并且最后在调试样例的时候,极其没有耐心。
两眼放空在那里发呆。
下次在显然时,再想想条件。
对于样例,手动模拟进去。
#include<cstdio>
const int N=500020;
int n;
long long f[N],g[N],c[N],a[N];
long long min(long long x,long long y){
    return x<y?x:y;
}
void work(){
    scanf("%d",&n);
    long long cnt=0;
    for(int i=1;i<=n;i++)scanf("%lld",f+i);
    for(int i=2;i<=n;i++)g[i]=f[i]-f[i-1];
    g[1]=f[1]-f[n];
    for(int i=1;i<=n;i++)g[i]=-g[i];
    c[1]=0;
    for(int i=3;i<=2*n;i+=2)c[(i-1)%n+1]=g[(i-1)%n+1]+c[(i-3)%n+1];
    for(int i=1;i<=n;i++)cnt+=c[i];
    if(cnt&1){
        cnt=0;
        for(int i=1;i<=n;i++)c[i]++,cnt+=c[i];
    }
    cnt/=2;
    int l=2,r=l+(n-1)-2;
    long long now=0;
    for(int i=2;i<=r;i+=2)now+=c[i];
    for(int i=1;i<=2*n;i+=2){
        a[(i-1)%n+1]=cnt-now;
        r=(r+2-1)%n+1;
        now=now-c[l]+c[r];
        l=(l+2-1)%n+1;
    }
    long long mn=100000009;
    for(int i=1;i<=n;i++)mn=min(mn,a[i]);
    for(int i=1;i<=n;i++)a[i]+=-mn;
    for(int i=1;i<=n;i++)printf("%lld ",a[i]);
    puts("");
}
int main(){
    // freopen("a.in","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)work();
    return 0;
}

                
            
        
浙公网安备 33010602011771号