Codeforces Round #467(Div2)题解

Posted david--lj

tags:

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

凌晨起来打CF,0:05,也是我第一次codeforces

第一题:

我刚开始怀疑自己读错题了,怎么会辣么水。

判除了0的数字种类

#include <cstdio>
int n,ans=0;
bool hsh[610];
int main(){
    scanf("%d",&n);int i;
    for(i=1;i<=n;++i){
        int x;scanf("%d",&x);if(!hsh[x] && x)++ans,hsh[x]=1;
    }
    printf("%d",ans);
}

第二题:让你找一个x使x<=y且x不能被[2,p]内的数整除,使x尽量大

其实是暴力枚举。

#include <cstdio>
int p,y;
bool ck(int x){
    int i;
    for(i=2;i*i<=x&&i<=p;++i)if(x%i==0)return 0;
    return 1;
}
int main(){
    scanf("%d%d",&p,&y);
    int i;
    for(i=y;i>p;--i)if(ck(i)){
        printf("%d",i);
        return 0;
    }
    printf("-1");
}

第三题,模拟题,太水了,不细说:

#include <cstdio>
#include <iostream>
using namespace std;
long long k,d,t;
double ans=0;
int main(){
    scanf("%I64d%I64d%I64d",&k,&d,&t);if(k%d==0){
        printf("%I64d",t);
        return 0;
    }
    long long tmp=(k/d+1)*d;tmp-=k; 
    double x=k,y=(double)tmp/2;
    long long tm=(long long)((double)t/(x+y));ans=tm*(k+tmp);double rt=(double)t-(double)tm*(x+y);
    if(rt<=k){
        ans+=rt;printf("%lf",ans);
    }else{
        ans+=k;rt-=k;ans+=rt*(double)2;printf("%lf",ans);
    }
}

第四题:

给你一个有向图,问你能否奇数步走到一个初度为0的点,输出路径

初看吓得我以为是SG函数,然而并不是, tarjan+bfs就行了

bfs和dp一起来,这里的dp可以用spfa的方式,用一个可以让元素多次进出的队列,然后搞dp

tarjan用来判能不能平局,如果s以后的路上没有scc,就输出lose

#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
#define maxn 100010
#define maxm 200010
struct edge{int nxt,to;}e[maxm];
int ans[maxn],out[maxn],scc_size[maxn],head[maxn],pos,n,m,scc[maxn],dfs_cnt,scc_cnt,i,st,dnf[maxn],low[maxn],pre[maxn][2];
bool dp[maxn][2],inq[maxn];
void add(int u,int v){e[++pos]=(edge){head[u],v},head[u]=pos;}
stack<int>s;
queue<int>q;
void tar(int u){
    dnf[u]=low[u]=++dfs_cnt;s.push(u);int i;
    for(i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(!dnf[v]){
            tar(v);low[u]=min(low[u],low[v]);
        }else if(!scc[v])low[u]=min(low[u],dnf[v]);
    }
    if(low[u]==dnf[u]){
        for(scc_cnt++;;){
            int x=s.top();s.pop();++scc_size[scc_cnt];
            scc[x]=scc_cnt;if(x==u)break;
        }
    }
}
void dfs(int u,int sta){
    if(u){
        dfs(pre[u][sta],sta==1 ? 0:1);
        ans[++ans[0]]=u;
    }
}
int main(){
    scanf("%d%d",&n,&m);int i;
    for(i=1;i<=n;++i){
        int k,x;scanf("%d",&k);
        while(k--){
            scanf("%d",&x);add(i,x);++out[i];
        }
    }
    scanf("%d",&st);
    for(i=1;i<=n;++i)if(!dnf[i])tar(i);
    bool flg=0;
    dp[st][0]=1;q.push(st);inq[st]=1;
    while(!q.empty()){
        int u=q.front();q.pop();inq[u]=0;
        if(scc_size[scc[u]]>1)flg=1;
        for(i=head[u];i;i=e[i].nxt){
            int v=e[i].to;
            if(dp[u][1] && dp[v][0]==0){
                dp[v][0]=1;pre[v][0]=u;if(!inq[v])q.push(v),inq[v]=1;
            }
            if(dp[u][0] && dp[v][1]==0){
                dp[v][1]=1;pre[v][1]=u;if(!inq[v])q.push(v),inq[v]=1;
            }
        }
    }
    for(i=1;i<=n;++i)if(dp[i][1] && out[i]==0){
        dfs(i,1);printf("Win\n");
        for(int j=1;j<=ans[0];++j)printf("%d ",ans[j]);return 0;
    }
    if(flg)printf("Draw");else printf("Lose");
}

T5明天更

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

Codeforces Round #467(Div2)题解

Codeforces Round #467 (Div. 2) -----d

Codeforces Round #467 (Div. 2) E-Lock Puzzle

Codeforces Round #705 (Div. 2)

Codeforces Round #774 (Div. 2)

Codeforces Round #808 (Div. 1)(A~C)