Codeforces Round #563 (Div. 2) A B C D

Codeforces Round #563 (Div. 2)

A:Ehab Fails to Be Thanos

题意:给你一个数组,是否存在一种顺序,使数组前一半和与后一半和不相等

排序,前n项和 后n项和 是否相等。

#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;
}
View Code

B:Ehab Is an Odd Person

题意:给你一个数组,if ai+aj是奇数 ,那么可以交换ai aj ,求字典序最小的数组

例:2 4 8 3 , 3可以移到任何一个位置,2 4 8 通过3也可以到任何位置,所以字典序最小为2 3 4 8

所以只要数组里面有奇数也有偶数,就直接排序后输出,否则将原数组直接输出

#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;
}
View Code

C:Ehab and a Special Coloring Problem

题意:如果i j互质,ai!=aj,给数组a赋值,使数组a中最大数最小

素数与任何数互质,所以每个素数对应的值不同,合数的值=其任何一个因子对应值,这样可以保证“如果i j互质,ai!=aj”;

#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;
}
View Code

D:Ehab and the Expected XOR Problem

题意:给你一个n,x,让你构造一个数组a,a满足1<=ai<2 , 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  

#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;
}
View Code
原文地址:https://www.cnblogs.com/YJing814/p/10974983.html