Reverse Sort Sum

· · 题解

这是一道不错的构造题

首先,明确如果 f_i = 0 那么这里的 ans_i = 0 ,因为如果这里为 1 的话,那么至少排序到第 i 位时,它会加 1,不成立,所以这一位显然为 0

因为我们需要找 0,所以我们将答案全部赋值成 1

结论
证明

故代码就很快就出来了,其实不难写。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
const int inf = 0x3f3f3f3f;
const int N = 2e5+5;
int Case,n,s[N],ans[N],cnt;
void solve(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s[i];ans[i]=1;
    }
    for(int i=0;i<n;i++){
        if(s[i]==0){
            ans[i]=0;
        }else{
            if(ans[i]==0)s[i]+=i;
            ans[s[i]]=0;
        }
        cout<<ans[i]<<" ";
    }
    cout<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>Case;
    while(Case--){
        solve();
    }
    return 0;
}

最后祝大家 noip 取得好成绩!