zoukankan      html  css  js  c++  java
  • Codeforces Round #676 (Div. 2)

    A

    按位枚举。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    #define pii pair<int,int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    int T,A,B;
    int main(){
        T=read();
        while(T--){
            A=read(),B=read();int Ans=0;
            for(int i=30;i>=0;i--){
                bool a=A&(1<<i),b=B&(1<<i);
                int cnt=a+b;
                if(cnt==2||cnt==0) continue;
                Ans+=(1<<i);
            }printf("%d
    ",Ans);
        }return 0;
    }
    View Code

    B

    分类讨论。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    #define pii pair<int,int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define int long long
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    using namespace std;
    const int MAXN=205;
    int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
    int n,tmp[MAXN][MAXN],b[MAXN][MAXN];char str[MAXN];bool vis[MAXN][MAXN];queue<pii> que;
    bool bfs(){
        while(!que.empty())que.pop();
        memset(vis,0,sizeof(vis));vis[1][1]=vis[1][2]=vis[2][1]=1;
        que.push(mp(1,2));que.push(mp(2,1));
        while(!que.empty()){
            pii now=que.front();que.pop();int x=now.fi,y=now.se;
            for(int i=0;i<4;i++){
                int nx=x+dx[i],ny=y+dy[i];
                if(nx>=1&&nx<=n&&ny>=1&&ny<=n)
                    if(!vis[nx][ny]&&(b[nx][ny]==2||b[nx][ny]==b[x][y])) vis[nx][ny]=true,que.push(mp(nx,ny));
            }
        }
        return vis[n][n];
    }
    bool SRY2(pii x,pii y){
        int res=0;
        for(int i=0;i<=10;i++) res+=i;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=tmp[i][j];
        b[x.fi][x.se]^=1;b[y.fi][y.se]^=1;return !bfs();
    }
    struct Union{
        int f[11];void init(){for(int i=1;i<=10;i++) f[i]=i;return;}
        int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
        void merge(int x,int y){int t1=find(x),t2=find(y);f[t2]=t1;return;}
    }S;
    bool SRY1(pii x){
        int res=0;
        for(int i=0;i<=10;i++) res+=i; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=tmp[i][j];
        b[x.fi][x.se]^=1;return !bfs();
    }
    vector<pii> vec;bool ff;
    void Read(){
        
    }
    signed main(){
        int T=read();
        while(T--){
            Read();
            n=read();ff=0;
            for(int i=1;i<=n;i++){
                scanf("%s",str+1);
                for(int j=1;j<=n;j++)
                    if(str[j]=='0') tmp[i][j]=0;
                    else if(str[j]=='1') tmp[i][j]=1;
                    else tmp[i][j]=2;
            }
            for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) b[i][j]=tmp[i][j];
            if(!bfs()){printf("0
    ");continue;}vec.clear();vec.pb(mp(1,2)),vec.pb(mp(2,1)),vec.pb(mp(n-1,n)),vec.pb(mp(n,n-1));
            for(auto XX:vec) if(SRY1(XX)) {printf("1
    %lld %lld
    ",XX.first,XX.second);ff=true;break;}if(ff) continue;
            for(auto XX:vec) for(auto YY:vec) if(!ff&&SRY2(XX,YY)){printf("2
    %lld %lld
    %lld %lld
    ",XX.first,XX.second,YY.first,YY.second);ff=true;break;}
            if(ff) continue;
            continue;
        }return 0;
    }
    View Code

    C

    简单构造。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    #define pii pair<int,int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    const int MAXN=1e5+11;
    char str[MAXN];int N;
    int main(){
        scanf("%s",str+1);N=strlen(str+1);
        N++;
        printf("3
    ");
        printf("L 2
    ");printf("R 2
    ");N=(N-2)*2+2;
        printf("R %d
    ",N-1);return 0;
    }
     
    View Code

    D

    大力讨论。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    #include<climits>
    #define int long long
    #define pii pair<int,int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    int T,X,Y,C[7],Minn;
    signed main(){
        //freopen("D.in","r",stdin);
        T=read();
        while(T--){
            X=read(),Y=read();
            for(int i=1;i<=6;i++) C[i]=read();Minn=LLONG_MAX;
            for(int i=0;i<=1;i++){
                for(int j=0;j<=1;j++){
                    for(int k=0;k<=1;k++){
                        int curx1=1,curx2=0,curx3=-1,cury1=1,cury2=1,cury3=0,cos1=C[1],cos2=C[2],cos3=C[3];
                        if(i==1) curx1=-1,cury1=-1,cos1=C[4];
                        if(j==1) curx2=0,cury2=-1,cos2=C[5];
                        if(k==1) curx3=1,cury3=0,cos3=C[6];
                        int x,y,z;
                        //X=0
                        x=0,y=(Y-cury1*x)/cury2,z=(X-curx1*x)/curx3;
                        if(x>=0&&y>=0&&z>=0) Minn=min(Minn,x*cos1+y*cos2+z*cos3);
                        //cerr<<"y:"<<y<<" z:"<<z<<" "<<cos1<<" "<<cos2<<" "<<cos3<<endl;
                        //X=A1
                        x=X,y=(Y-cury1*x)/cury2,z=(X-curx1*x)/curx3;
                        if(x>=0&&y>=0&&z>=0) Minn=min(Minn,x*cos1+y*cos2+z*cos3);
                        //X=A2
                        x=Y,y=(Y-cury1*x)/cury2,z=(X-curx1*x)/curx3;
                        if(x>=0&&y>=0&&z>=0) Minn=min(Minn,x*cos1+y*cos2+z*cos3);
                        //X=-A1
                        x=-X,y=(Y-cury1*x)/cury2,z=(X-curx1*x)/curx3;
                        if(x>=0&&y>=0&&z>=0) Minn=min(Minn,x*cos1+y*cos2+z*cos3);
                        //X=-A2
                        x=-Y,y=(Y-cury1*x)/cury2,z=(X-curx1*x)/curx3;
                        if(x>=0&&y>=0&&z>=0) Minn=min(Minn,x*cos1+y*cos2+z*cos3);
                    }
                }
            }
            printf("%lld
    ",Minn);
            //return 0;
        }return 0;
    }
     
     
    View Code

    E

    考虑我们将每个数的权值定为 $1,-1$。设总长度为 $n$ ,$-1$ 的个数 $m$。可以发现 $n+mmod 3=1$ !,且只要不是 $+-+-+-$ 等就可以符合条件,证明可以归纳即可。

    直接 $dp$ 即可。 

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<algorithm>
    #include<climits>
    #include<bitset>
    #define pii pair<int,int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define int long long
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    const int MAXN=2e5+11;
    int N,A[MAXN],f[MAXN][3][2][2];//sum 1/0 ok?
    signed main(){
        //freopen("in2.txt","r",stdin);
        N=read();for(int i=1;i<=N;i++) A[i]=read();int cur=N%3;
        memset(f,-127/3,sizeof(f));f[1][cur][1][1]=A[1];f[1][(1+cur)%3][0][1]=-A[1];
        if(N==1){printf("%lld
    ",A[1]);return 0;}
        for(int i=1;i<N;i++){
            for(int j=0;j<=2;j++){
                for(int k=0;k<=1;k++){
                    for(int z=0;z<=1;z++){
                        for(int s=0;s<=1;s++){
                            int now=s*2-1,las=k*2-1;
                            int ok=(s^k)&z,sum=(j+(now==-1))%3;
                            f[i+1][sum][s][ok]=max(f[i+1][sum][s][ok],f[i][j][k][z]+A[i+1]*now);
                        }
                    }
                }
            }
        }
        int Maxn=max(f[N][1][1][0],f[N][1][0][0]);
        printf("%lld
    ",Maxn);return 0;
    }
    View Code
  • 相关阅读:
    Splay板子
    HZOI帝国2019欢乐时刻
    数据分析体系 — 用户粘性的两个计算指标(DAU/MAU和月人均活跃天数)
    mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理
    每日一题力扣575 分糖果
    每日一题力扣455 小饼干和孩子
    每日一题力扣561
    每日一题力扣121 最佳买股票
    每日一题力扣605 种花问题
    每日一题力扣605 种花问题
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/13840262.html
Copyright © 2011-2022 走看看