Codeforces Round #467(Div2)題解
阿新 • • 發佈:2018-02-27
是我 第一次 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)題解