Reverse Sort Sum
这是一道不错的构造题
首先,明确如果
因为我们需要找
结论
证明
-
前
i 个数排列时它一直为1 ,在i 后当存在一个点使这一位再次为0 时,从此点往后所有排列后的结果,ans_i 一直为0 ,所以当且仅当从i 至i+s_i-1 的ans 的值都为1 。则第i+s_i 排序后第i 位一定是0 ,所以第i+s_i 位一定是0 。 -
如果这一位为
1 ,那么第s_i 位为0 ,证法与上文相同,留给读者思考。
故代码就很快就出来了,其实不难写。
#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;
}
最后祝大家