题意:
给定长度为n的序列a,保证a中的数各不相同,
要求构造一个长度为n的序列b,满足:
1.b序列由a序列重排得到,
2.对于任意大小在[1,n-1]的下标子集,b序列和a序列对于该子集的子集和不同
如果无解输出-1
数据范围:n<=22,a(i)<=1e9
解法:
将a序列中的最大值放到最小值对应b序列中的位置,此时a中的最大值没了,
对于a序列中其他位置的值,放刚好大于它的数的对应位置的中,
即按大小将其他每个位置错位.
正确性证明:
1.如果集合不包含b序列中的最大值,那么显然成立,因为错位了.
2.如果集合包含b序列中的最大值,考虑这个集合的补集,
显然补集满足条件1,补集的和不想等,那么当前集合也不相等.
(因为:补集的和+当前集合的和=序列和)
code
#include<bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
pair<int,int>temp[maxm];
int a[maxm];
int b[maxm];
int n;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
temp[i]={a[i],i};
}
sort(temp+1,temp+1+n);
b[temp[1].second]=temp[n].first;
for(int i=2;i<=n;i++){
b[temp[i].second]=temp[i-1].first;
}
for(int i=1;i<=n;i++){
cout<<b[i]<<' ';
}
return 0;
}