20191028 Codeforces Round #534 (Div. 1) - Virtual Participation

菜是原罪。

英语不好更是原罪。


\(\mathrm{A - Grid game}\)

题解

\(4 \times 4\) 的格子,两种放法。

发现这两种在一起时候很讨厌,于是强行拆分这个格子

上面 \(2 \times 4\) 给横的,下面给竖的。

\(\mathrm{Code}\)

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

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

int n;
char s[1007];

int a[8][8];

void del(){
    for(int i=1;i<=4;i++){
        int sum=0;
        for(int j=1;j<=4;j++){
            sum+=a[i][j];
        }
        if(sum==4){
            for(int j=1;j<=4;j++) a[i][j]=0;
        }
    }
}

int ex1[3][3],ex2[3][3];

void solve(int x){
    if(x==1){
        if(!ex1[1][1]){
            printf("%d %d\n",1,1);
            ex1[1][1]=1;
        }
        else if(!ex1[1][2]){
            printf("%d %d\n",1,3);
            ex1[1][2]=1;
        }
        else if(!ex1[2][1]){
            printf("%d %d\n",2,1);
            ex1[2][1]=1;
        }
        else if(!ex1[2][2]){
            printf("%d %d\n",2,3);
            ex1[2][2]=1;
        }
        if(ex1[1][1]&&ex1[1][2]) ex1[1][1]=ex1[1][2]=0;
        if(ex1[2][1]&&ex1[2][2]) ex1[2][1]=ex1[2][2]=0;
    }
    else{
        if(!ex2[1][1]){
            printf("%d %d\n",3,1);
            ex2[1][1]=1;
        }
        else if(!ex2[1][2]){
            printf("%d %d\n",3,2);
            ex2[1][2]=1;
        }
        else if(!ex2[2][1]){
            printf("%d %d\n",3,3);
            ex2[2][1]=1;
        }
        else if(!ex2[2][2]){
            printf("%d %d\n",3,4);
            ex2[2][2]=1;
        }
        if(ex2[1][1]&&ex2[1][2]&&ex2[2][1]&&ex2[2][2]) ex2[1][1]=ex2[1][2]=ex2[2][1]=ex2[2][2]=0000;
//      if(ex1[1][1]&&ex1[1][2]) ex1[1][1]=ex1[1][2]=0;
//      if(ex1[2][1]&&ex1[2][2]) ex1[2][1]=ex1[2][2]=0;
    }
}

int main(){
    cin>>(s+1);
    n=strlen(s+1);memset(a,1,sizeof(a));
    for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) a[i][j]=0;
    for(int qwq=1;qwq<=n;qwq++){
        int k=s[qwq]-'0';
        solve(k);
    }
    return 0;
}

\(\mathrm{B - Game with modulo}\)

题解

真是一个神仙交互题。

首先需要想到一个结论,函数 \(f(x)=x \bmod a\) 是一个周期函数, \(T=a\)

这个题目一开始的想法就是二分,但是由于 \(a\) 取模的问题,不太满足可二分性。

但是在一个周期内,是可以二分的。

于是倍增确定 \(a\) 的取值范围,二分答案。

\(60\) 次询问卡的紧紧的...

cyz同学问了 \(61\) 次...

\(\mathrm{Code}\)

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

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

string s;

int main(){
    while(1){
        cin>>s;
        if(s=="end") break;
        if(s=="mistake") break;
        int l=0,r=1;
        while(1){
            printf("? %d %d\n",l,r);
            fflush(stdout);
            cin>>s;
            if(s=="y") l=r,r*=2;
            else break;
        }
        int ans;
        while(l<r-1){
            int mid=(l+r)>>1;
            printf("? %d %d\n",mid,l);
            fflush(stdout);
            cin>>s;
            if(s=="x") l=mid;
            else r=mid;
        }
        ++l;
        printf("! %d\n",l);
        fflush(stdout);
    }
    return 0;
}

\(\mathrm{C - Johnny Solving}\)

题解

首先 STO hkk。

hkk:由于这个和环有关,所以可以想到生成树。

随便画个生成树,可以得到如果有深度超过 \(\frac{n}{k}\) 的点,则肯定有成立的路径。

否则叶子结点一定超过 \(k\) 个。

又有每个点的度超过 \(3\) ,则在 \(dfs\) 树上至少有两条返祖边,构成 \(3\) 个环,且至少有一个长度不是 \(3\) 的倍数。

于是构建出 \(dfs\) 树,搞一搞即可。

xxxxx

即得易见平凡,由上自证显然,留作习题答案略,读者自证不难。

反之亦然同理,推论自然成立,略去过程Q.E.D,由上可知证毕。

xxxxx

\(\mathrm{Code}\)

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

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=250007;

int n,m,k;
int lim;

int Head[maxn],Next[1000007],to[1000007],tot=1;

void add(int x,int y){
    to[++tot]=y,Next[tot]=Head[x],Head[x]=tot;
}

int dfn[maxn],dep[maxn];
int fa[maxn],mx,pos;

bool vis[maxn];

vector<int>lea;

void dfs(int x,int f,int dp){
    fa[x]=f,dep[x]=dp,vis[x]=1;
    if(dep[x]>mx){
        mx=dep[x],pos=x;
        if(mx>=(n+k-1)/k){
            puts("PATH");
            printf("%d\n",mx);
            int p=x;
            while(p){
                printf("%d ",p);p=fa[p];
            }
            puts("");exit(0);
        }
    }
    bool res=false;
    for(int i=Head[x];i;i=Next[i]){
        int y=to[i];
        if(vis[y]) continue;
        dfs(y,x,dp+1);res=true;
    }
    if(!res) lea.push_back(x);
}

bool comp(int a,int b){
    return dep[a]<dep[b];
}

int main(){
    read(n);read(m);read(k);
    if(n%k) lim=n/k;
    else lim=n/k+1;
    for(int i=1,x,y;i<=m;i++){
        read(x);read(y);
        add(x,y);add(y,x);
    }
    dfs(1,0,1);
    puts("CYCLES");
    bool res;
    for(int i=0;i<k;i++){
        int x=lea[i];
        res=false;vector<int>v;v.clear();
        for(int i=Head[x];i;i=Next[i]){
            int y=to[i];
            if(v.size()!=2) v.push_back(y);
            if(y==fa[x]||(dep[x]-dep[y]+1)%3==0) continue;
            printf("%d\n",dep[x]-dep[y]+1);
            int p=x;
            while(p!=fa[y]){
                printf("%d ",p);
                p=fa[p];
            }
            puts("");
            res=1;break;
        }
        if(res) continue;
        sort(v.begin(),v.end(),comp);
        printf("%d\n",dep[v[1]]-dep[v[0]]+2);
        int a=v[0],b=v[1];
        while(fa[a]!=fa[b]) printf("%d ",b),b=fa[b];
        printf("%d %d\n",b,x);
    }
    return 0;
}

\(\mathrm{D-Professional layer}\)

题解

一个萌萌萌新的看题解心路...

截止2019.10.30 17:45,我还没有A掉这道题...

\(\mathrm{Code}\)


\(\mathrm{E-Radix sum}\)

神仙多项式题,不会。

全部评论

相关推荐

过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务