Codeforces Global Round 1

Posted shanxieng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 1相关的知识,希望对你有一定的参考价值。

竟然又没掉?

A - Parity

先判断基数是奇数还是偶数,如果是偶数,其奇偶性显然只与个位的奇偶性相关,否则与所有数位的数的和的奇偶性相关。

#include<bits/stdc++.h>
using namespace std;

char gc() {
//  static char buf[100000],*p1,*p2;
//  return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
    return getchar();
}

template<class T>
int read(T &ans) {
    T f=1;ans=0;
    char ch=gc();
    while(!isdigit(ch)) {
        if(ch==EOF) return EOF;
        if(ch=='-') f=-1;
        ch=gc();
    }
    while(isdigit(ch))
        ans=ans*10+ch-'0',ch=gc();
    ans*=f;return 1;
}

template<class T1,class T2>
int read(T1 &a,T2 &b) {
    return read(a)==EOF?EOF:read(b);
}

template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
    return read(a,b)==EOF?EOF:read(c);
}

typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;

int b,k,a[Maxn];

int main() {
    read(b,k);
    for(int i=1;i<=k;i++) read(a[i]);
    if(b&1) {
        int zhy=0;
        for(int i=1;i<=k;i++) zhy+=a[i];
        if(zhy&1) puts("odd");
        else puts("even");
    }
    else
        if(a[k]&1) puts("odd");
        else puts("even");
    return 0;
}

B - Tape

贪心一下就好了,好像usaco上讲过的。

#include<bits/stdc++.h>
using namespace std;

char gc() {
//  static char buf[100000],*p1,*p2;
//  return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
    return getchar();
}

template<class T>
int read(T &ans) {
    T f=1;ans=0;
    char ch=gc();
    while(!isdigit(ch)) {
        if(ch==EOF) return EOF;
        if(ch=='-') f=-1;
        ch=gc();
    }
    while(isdigit(ch))
        ans=ans*10+ch-'0',ch=gc();
    ans*=f;return 1;
}

template<class T1,class T2>
int read(T1 &a,T2 &b) {
    return read(a)==EOF?EOF:read(b);
}

template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
    return read(a,b)==EOF?EOF:read(c);
}

typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;

int n,m,k,a[Maxn];
priority_queue<int,vector<int>,greater<int> > q;

int main() {
    read(n,m,k);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<n;i++) q.push(a[i+1]-a[i]-1);
    int ans=n;
    n-=k;
    while(n--) {
        ans+=q.top();
        q.pop();
    }
    printf("%d
",ans);
    return 0;
}

C - Meaningless Operations

首先观察样例,可以发现0与另一个数字的gcd就是另一个数字,那么如果这个数的位不满,就一定可以选出来一个数与他的&为0,而^为所有位满的数。

如果满的话,可以发现异或就是减去这个数,而位与还是这个数,那么这个数如果就是那个数的约数,其gcd就是这个约数。那么就可以选择那个数的最大的约数即可。

#include<bits/stdc++.h>
using namespace std;

char gc() {
//  static char buf[100000],*p1,*p2;
//  return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
    return getchar();
}

template<class T>
int read(T &ans) {
    T f=1;ans=0;
    char ch=gc();
    while(!isdigit(ch)) {
        if(ch==EOF) return EOF;
        if(ch=='-') f=-1;
        ch=gc();
    }
    while(isdigit(ch))
        ans=ans*10+ch-'0',ch=gc();
    ans*=f;return 1;
}

template<class T1,class T2>
int read(T1 &a,T2 &b) {
    return read(a)==EOF?EOF:read(b);
}

template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
    return read(a,b)==EOF?EOF:read(c);
}

typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;

int q,x;

int main() {
    read(q);
    while(q--) {
        read(x);
        int sxz=1;
        while(sxz<=x) sxz<<=1;
        sxz--;
        if(x==sxz) {
            int flag=0;
            for(int i=2;i*i<=sxz;i++)
                if(sxz%i==0) {
                    flag=sxz/i;
                    break;
                }
            if(!flag) puts("1");
            else printf("%d
",flag);
        }
        else printf("%d
",sxz);
    }
    return 0;
}

D - Jongmah

很显然,如果是连着的三个超过了三个,那么一定就没有意义了,因为可以选三个相同的也能达到相同的效果,所以可以直接进行DP了。

#include<bits/stdc++.h>
using namespace std;

char gc() {
//  static char buf[100000],*p1,*p2;
//  return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
    return getchar();
}

template<class T>
int read(T &ans) {
    T f=1;ans=0;
    char ch=gc();
    while(!isdigit(ch)) {
        if(ch==EOF) return EOF;
        if(ch=='-') f=-1;
        ch=gc();
    }
    while(isdigit(ch))
        ans=ans*10+ch-'0',ch=gc();
    ans*=f;return 1;
}

template<class T1,class T2>
int read(T1 &a,T2 &b) {
    return read(a)==EOF?EOF:read(b);
}

template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
    return read(a,b)==EOF?EOF:read(c);
}

typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;

int n,m,x,a[Maxn],f[Maxn][3][3];

int main() {
    read(n,m);
    for(int i=1;i<=n;i++) {
        read(x);
        a[x]++;
    }
    for(int i=1;i<=m;i++) {
        for(int j=0;j<3;j++)
            for(int k=0;k<3;k++)
                for(int l=0;l<3;l++) {
                    if(j+k+l>a[i]) continue;
                    f[i][k][l]=max(f[i][k][l],f[i-1][j][k]+l+(a[i]-j-k-l)/3);
                }
    }
    printf("%d
",f[m][0][0]);
    return 0;
}

E - Magic Stones

先差分,然后发现操作的本质就是交换两个数,具体可以参考题解。

#include<bits/stdc++.h>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std;

char gc() {
//  static char buf[100000],*p1,*p2;
//  return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
    return getchar();
}

template<class T>
int read(T &ans) {
    T f=1;ans=0;
    char ch=gc();
    while(!isdigit(ch)) {
        if(ch==EOF) return EOF;
        if(ch=='-') f=-1;
        ch=gc();
    }
    while(isdigit(ch))
        ans=ans*10+ch-'0',ch=gc();
    ans*=f;return 1;
}

template<class T1,class T2>
int read(T1 &a,T2 &b) {
    return read(a)==EOF?EOF:read(b);
}

template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
    return read(a,b)==EOF?EOF:read(c);
}

typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;

int n,a[Maxn],b[Maxn];

int main() {
    read(n);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<=n;i++) read(b[i]);
    if(a[1]!=b[1]||a[n]!=b[n]) {
        puts("No");
        return 0;
    }
    for(int i=1;i<n;i++) a[i]=a[i+1]-a[i],b[i]=b[i+1]-b[i];
    sort(a+1,a+n),sort(b+1,b+n);
    for(int i=1;i<n;i++) {
        if(a[i]!=b[i]) {
            puts("No");
            return 0;
        }
    }
    puts("Yes");
    return 0;
}

以上是关于Codeforces Global Round 1的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Global Round 1

Codeforces Global Round 1

Codeforces Global Round 1

Codeforces Global Round 1

Codeforces Global Round 19

Codeforces Global Round 1 AParity