首页 > 代码库 > 15 day 1
15 day 1
第一题
用堆维护。
#include <cstdio>#include <algorithm>#include <queue>int n,i,f[400000],g[2][200000],j=0,k[400000];int l,r;bool cho;struct pn{ int l,r,n;};bool operator<(pn a,pn b){ return a.n>b.n;}std::priority_queue<pn> q;pn as,as1,as2;int main(){ freopen("minval.in","r",stdin); freopen("minval.out","w",stdout); scanf("%d",&n); for(i=0;i<n;++i) scanf("%d",&g[0][i]); for(i=0;i<n;++i) scanf("%d",&g[1][i]); std::sort(g[0],g[0]+n); std::sort(g[1],g[1]+n); as.l=0; as.r=0; as.n=g[0][0]+g[1][0]; q.push(as); for(i=0;i<n;++i){ as=q.top(); q.pop(); as1.l=as.l+1; as1.r=as.r; as1.n=g[0][as1.l]+g[1][as1.r]; as2.l=as.l; as2.r=as.r+1; as2.n=g[0][as2.l]+g[1][as2.r]; printf("%d ",as.n); q.push(as1); q.push(as2); } return 0;}
第二题
连通性判定+二分图
#include <cstdio>#include <cstring>int f[200000],d,i,j,m,n,s,t,tt,a,b,pl,h[200000];int q[200000],qh,qt;bool f2;struct edge{ int t,n;} edges[2000000];inline void addedge(int f,int t){ edges[++pl].n=h[f]; edges[ pl ].t= t ; h[f]=pl;} int main(){ freopen("catch.in","r",stdin); freopen("catch.out","w",stdout); scanf("%d",&tt); while(tt--){ ++j; memset(f,0,sizeof f); memset(h,0,sizeof h); pl=0; qh=qt=0; scanf("%d%d%d",&n,&m,&s); for(i=0;i<m;++i){ scanf("%d%d",&a,&b); addedge(a,b); addedge(b,a); } q[qt++]=s; f2=false; f[s]=1; --n; while(qh!=qt){ i=q[qh++]; for(d=h[i];d;d=edges[d].n){ t=edges[d].t; if(!f[t]){ f[t]=3-f[i]; q[qt++]=t; --n; }else{ if(f[i]==f[t]) f2=true;//not bicolorable } } } if(!f2){ printf("Case %d: NO\n",j); }else{ if(n) printf("Case %d: NO\n",j); else printf("Case %d: YES\n",j); } } return 0;}
15 day 1
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。