Codeforces Round #628 (Div. 2) ABCD(C大胆猜测,D数学异或计算)

A EhAb AnD gCd

题意:

给你一个数x。
要求你找到两个数,使得 g c d ( a , b ) + l c m ( a , b ) = x gcd(a,b)+lcm(a,b)=x gcdab+lcmab=x

思路:

简单数学的构造。可以想到用1和x-1就好了。

AC

/*
皮卡丘冲鸭!
へ     /|
  /\7    ∠_/
  / │   / /
 │ Z _,< /   /`ヽ
 │     ヽ   /  〉
  Y     `  /  /
 イ● 、 ●  ⊂⊃〈  /
 ()  へ    | \〈
  >ー 、_  ィ  │ //
  / へ   / ノ<| \\
  ヽ_ノ  (_/  │//
  7       |/
  >―r ̄ ̄`ー―_
*/
#include <iostream>
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define sz(a) (int)a.size()
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
const int N = 1e3;
const int M = 1e5;
int main()
{
    
    
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tt;
    cin>>tt;
    while(tt--){
    
    
        int x;
        cin>>x;
        cout<<1<<' '<<x-1<<endl;
    }
    return 0;
}

B CopyCopyCopyCopyCopy

题意

给你一个数组,问你进行,n次复制后,最长上升子序列的长度是多少。

思路:

题目观察,可以发现,可以贪心的在n个n大小的数组中,每次都选择一个元素
其实就是排序之后,之后unique操作。

AC

/*
皮卡丘冲鸭!
へ     /|
  /\7    ∠_/
  / │   / /
 │ Z _,< /   /`ヽ
 │     ヽ   /  〉
  Y     `  /  /
 イ● 、 ●  ⊂⊃〈  /
 ()  へ    | \〈
  >ー 、_  ィ  │ //
  / へ   / ノ<| \\
  ヽ_ノ  (_/  │//
  7       |/
  >―r ̄ ̄`ー―_
*/
#include <iostream>
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define sz(a) (int)a.size()
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
const int N = 1e3;
const int M = 1e5;
int main()
{
    
    
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tt;
    cin>>tt;
    while(tt--){
    
    
        int n;
        cin>>n;
        vector<int> v(n);
        fori(i,0,n)cin>>v[i];
        sort(v.begin(),v.end());
        int pre = v[0], ans = 1;
        fori(i,1,n){
    
    
            if(v[i]!=pre)ans++;
            pre = v[i];
        }
        cout<<ans<<endl;
    }
    return 0;
}

CEhab and Path-etic MEXs

题意:

给一颗树的每一条边编号,使得任意两点之间 MEX最小的编号,这个编号在这两个点间的边之间没有被使用。
找到一种构造使得,所有pair间的最大值MEX尽可能小。

思路:

可以从点的度出发,一个点的度大于2时,把它连接的边都标号。

AC

/*
皮卡丘冲鸭!
へ     /|
  /\7    ∠_/
  / │   / /
 │ Z _,< /   /`ヽ
 │     ヽ   /  〉
  Y     `  /  /
 イ● 、 ●  ⊂⊃〈  /
 ()  へ    | \〈
  >ー 、_  ィ  │ //
  / へ   / ノ<| \\
  ヽ_ノ  (_/  │//
  7       |/
  >―r ̄ ̄`ー―_
*/
#include <iostream>
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define sz(a) (int)a.size()
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
const int N = 1e3;
const int M = 1e5+10;
int x[M], y[M];
vector<pa> e[M];
int ans[M];
int in[M], deg[M], degB[M];
int main()
{
    
    
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n;
    cin>>n;
    fori(i,0,n-1)cin>>x[i]>>y[i],in[x[i]]++,in[y[i]]++;
    fori(i,0,n-1){
    
    
        e[x[i]].pb(mp(y[i],i));
        e[y[i]].pb(mp(x[i],i));
    }
    mst(ans,-1);
    int cnt= 0;
    For(i,1,n){
    
    
        if(in[i]>2){
    
    
            for(auto p : e[i]){
    
    
                int idx = p.se;
                if(ans[idx]==-1)ans[idx]=cnt++;
            }
        }
    }
    /*
    fori(i,0,n-1){
        degB[i] = deg[i] = in[x[i]]+in[y[i]];
    }
    sort(degB,degB+n-1);
   // int ans[M]{};
   priority_queue<pa> q;
    fori(i,0,n-1){
        int idx = lower_bound(degB,degB+n-1,deg[i])-degB;
        q.push(mp(idx,i));//if(idx)
    }
    int cnt  = 0;
    while(!q.empty()){
        int idx = q.top().se;q.pop();
        ans[idx] = cnt;
        cnt++;
    }
    */
    fori(i,0,n-1)
        if(ans[i]==-1)cout<<(cnt++)<<endl;
        else cout<<ans[i]<<endl;
    return 0;
}

DEhab the Xorcist

思路

大佬1的思路
大佬2的思路

AC

/*
皮卡丘冲鸭!
へ     /|
  /\7    ∠_/
  / │   / /
 │ Z _,< /   /`ヽ
 │     ヽ   /  〉
  Y     `  /  /
 イ● 、 ●  ⊂⊃〈  /
 ()  へ    | \〈
  >ー 、_  ィ  │ //
  / へ   / ノ<| \\
  ヽ_ノ  (_/  │//
  7       |/
  >―r ̄ ̄`ー―_
*/
#include <iostream>
#include <bits/stdc++.h>
#define For(i,x,y) for(int i=(x); i<=(y); i++)
#define fori(i,x,y) for(int i=(x); i<(y); i++)
#define rep(i,y,x) for(int i=(y); i>=(x); i--)
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define sz(a) (int)a.size()
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
const int N = 1e3;
const int M = 1e5;
typedef long long ll;
int main()
{
    
    
    //ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ll u,v;
    cin>>u>>v;
    if(u>v)return 0*printf("-1");
    if(u==0&&v==0)return 0*printf("0");
    if(u==v) return 0*printf("1\n%lld",v);
    if((v-u)%2==0){
    
    
        ll a = (v-u)/2;
        if((u&a)==0) return 0*printf("2\n%lld %lld",u+a,a);
        else return 0*printf("3\n%lld %lld %lld", u, a, a);
    }
    printf("-1");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45377553/article/details/113059534