1. 程式人生 > >Codeforces Round #467(Div2)題解

Codeforces Round #467(Div2)題解

是我 第一次 pac name sca algo empty code edge

淩晨起來打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)題解