Codeforces Round 983 (Div. 2) 小結

Qzong發表於2024-11-02

<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;
}

相關文章