Codeforces Round #563 (Div. 2)
题意:给你一个数组,是否存在一种顺序,使数组前一半和与后一半和不相等
排序,前n项和 后n项和 是否相等。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; const int N=1e4; int a[N]; int n; int main(){ cin>>n; for(int i=0;i<2*n;i++){ cin>>a[i]; } sort(a,a+2*n); int sum1=0 ,sum2=0; for(int i=0;i<n;i++){ sum1+=a[i]; sum2+=a[i+n]; } if(sum1==sum2){ cout<<"-1 "; } else{ for(int i=0;i<2*n;i++){ cout<<a[i]<<" "; } cout<<" "; } return 0; }
题意:给你一个数组,if ai+aj是奇数 ,那么可以交换ai aj ,求字典序最小的数组
例:2 4 8 3 , 3可以移到任何一个位置,2 4 8 通过3也可以到任何位置,所以字典序最小为2 3 4 8
所以只要数组里面有奇数也有偶数,就直接排序后输出,否则将原数组直接输出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; const int N=2e5; typedef long long ll; int n; ll a[N]; int main(){ cin>>n; int flag=0,ff=0; for(int i=0;i<n;i++){ cin>>a[i]; if(a[i]%2)flag=1; else ff=1; } if(!ff||!flag) { for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<" "; return 0; } sort(a,a+n); for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<" "; return 0; }
C:Ehab and a Special Coloring Problem
题意:如果i j互质,ai!=aj,给数组a赋值,使数组a中最大数最小
素数与任何数互质,所以每个素数对应的值不同,合数的值=其任何一个因子对应值,这样可以保证“如果i j互质,ai!=aj”;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; const int N=2e5; int n; int a[N]={0}; int main(){ cin>>n; int j=1; for(int i=2;i<=n;i++){ if(a[i]==0){ for(int k=i;k<=n;k+=i){ a[k]=j; } j++; } } for(int i=2;i<=n;i++){ cout<<a[i]<<" "; } cout<<" "; return 0; }
D:Ehab and the Expected XOR Problem
题意:给你一个n,x,让你构造一个数组a,a满足1<=ai<2n , a中任何一个子段的异或和不为0或x , 数组长度l尽量大
设a的异或前缀和为b, bi=a0^a1^a2……ai
设数组a中一个子段为 ai^ai+1^a……^ak=bi-1^bk 即任何一个子段的异或和都可以表示成两个bi的异或和
要使任意一个子段的异或和不为0或x ,即要使任意bi^bj 不为 0 ,x
求出b, 然后ai=bi^bi-1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; int n,x; set<int> s; vector<int> v; int main(){ cin>>n>>x; for(int i=1;i<1<<n;i++){ s.insert(i); } s.erase(x); v.push_back(0); while(!s.empty()){ int p=*s.begin(); s.erase(p); s.erase(p^x); v.push_back(p); } cout<<v.size()-1<<" "; for(int i=1;i<v.size();i++){ cout<<(v[i]^v[i-1])<<" "; } cout<<" "; return 0; }