Codeforces Round #769 (Div. 2)

比赛链接

由于之前学了下快读,后面所有程序都用快读了,代码长一些(全是模板)

A太水,n>=3直接不可能,n=1也不可能,n=2判断一下两位是否一样就行

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T& x) {
    x=0;T f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=x*f;
    return;
}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){
    read(x);
    read(arg...);
}
template <typename T>inline void write(T x) {
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){
    write(x);
    putchar(' ');
    write(arg...);
}
int main(){
    int x,T,n;
    read(T);
    string s;
    while(T--){
        read(n);
        cin>>s;
        if(n>=3) printf("NO\n");
        else if (n==2){
            if(s[0]!=s[1]) printf("YES\n"); else printf("NO\n");
        }
        else printf("YES\n");
    }
    return 0;
}

B:0-n的某种排列,让每相邻两个数做异或,总共有n个结果,问max(n个结果)的最小值是多少

max(n个结果)最高位肯定是1,是某最高位为1和另一最高位为0的数异或而成,不如直接让所有最高位为0放左边,最高位为1放右边,交界处是0和10000000,异或结果是最小的

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T& x) {
    x=0;T f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=x*f;
    return;
}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){
    read(x);
    read(arg...);
}
template <typename T>inline void write(T x) {
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){
    write(x);
    putchar(' ');
    write(arg...);
}
int a[200005];
int main(){
    int x,T,i,t,n;
    read(T);
    x=1;
    while(x<200005){
        a[x]=666;x*=2;
    }
    while(T--){
        cin>>n;t=0;n--;
        if(a[n]==666){
            for(i=1;i<n;i++) printf("%d ",i);
            printf("%d %d\n",0,n);
            continue;
        } 
        while(n--){
            if(a[n+1]==666&&t==0){
                printf("%d 0 ",n+1);
                t=n+1;
            }
            else printf("%d ",n+1);
        }
    }
}

 

C: 

给你a,b,有如下三种操作

a++

b++

a=a | b

每次选一种进行一次操作,问最少多少次可以让a=b

本来用自己脑补的巧方法做半天,后来群友说直接暴力,结果真就直接暴力出来了:

两种情况:1、不停地给a+1,直到a|b=b;2、不停地给b+1,直到a|b=b

#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void read(T& x) {
    x=0;T f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=x*f;
    return;
}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){
    read(x);
    read(arg...);
}
template <typename T>inline void write(T x) {
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
template <typename T,typename ...Arg>void write(T& x,Arg& ...arg){
    write(x);
    putchar(' ');
    write(arg...);
}
int main(){
    int x,y,a,b,yy,xx,ans,res,T;
    read(T);
    while(T--){
        read(x,y);
        ans=y-x;
        for(int i=x;i<=x+ans;i++){
            if(i==y) 
                ans=min(ans,i-x);
            else if((i|y)==y) 
                ans=min(ans,i-x+1);
        }
        for(int i=y;i<=y+ans;i++){
            if((i|x)==i) 
                ans=min(ans,i-y+1);
        }
//        printf("xx:%d yy:%d a:%d\n",xx,yy,a); 
        printf("%d\n",ans);
    }
}

 D题略可惜,st表题,手头没有st表的模板,对网上的st表板子修改时间也不够了,这两天赶紧补一个st表板子出来。

上一篇:PHP类的原理


下一篇:Python—入门例程(持续更新)