[Atcoder Grand Contest 001] Tutorial
Posted newera
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Atcoder Grand Contest 001] Tutorial相关的知识,希望对你有一定的参考价值。
Link:
A:
#include <bits/stdc++.h> using namespace std; long long res=0; int n,dat[500]; int main() { scanf("%d",&n); for(int i=1;i<=2*n;i++) scanf("%d",&dat[i]); sort(dat+1,dat+2*n+1); for(int i=1;i<=2*n;i+=2) res+=dat[i]; printf("%lld",res); return 0; }
B:
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll n,k; int main() { scanf("%lld%lld",&n,&k); if(n%k==0) printf("%lld",k*(n/k-1)*3); else printf("%lld",k*(n/k)*3); return 0; }
C:
#include <bits/stdc++.h> using namespace std; const int MAXN=2005; struct edge{int to,nxt;}e[MAXN<<2]; int n,k,x,y,head[MAXN],dist[MAXN],tot=0,tmp=0,res=0,S=0; void add_edge(int from,int to) { e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot; e[++tot].nxt=head[to];e[tot].to=from;head[to]=tot; } int dfs(int x,int anc,int lmt) { int ret=1;if(x==S) dist[x]=0; for(int i=head[x];i;i=e[i].nxt) { if(e[i].to==anc) continue; dist[e[i].to]=dist[x]+1; if(dist[e[i].to]<=lmt) ret+=dfs(e[i].to,x,lmt); } return ret; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<n;i++) scanf("%d%d",&x,&y),add_edge(x,y); for(int i=1;i<=n;i++) res=max(res,dfs(S=i,0,k/2)); if(!(k&1)) return printf("%d",n-res),0; for(int i=1;i<=n;i++) for(int j=head[i];j;j=e[j].nxt) res=max(res,dfs(S=i,e[j].to,(k-1)>>1)+dfs(S=e[j].to,i,(k-1)>>1)); printf("%d",n-res); return 0; }
D:
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; int n,m,dat[MAXN],o1,o2,st; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&dat[i]); for(int i=1;i<=m;i++) if(dat[i]&1) if(!o1) o1=i; else if(!o2) o2=i; else return puts("Impossible"),0; if(o1) swap(dat[1],dat[o1]); if(o2) swap(dat[m],dat[o2]); for(int i=1;i<=m;i++) printf("%d ",dat[i]); if(m==1) m++; dat[1]--;dat[m]++;st=dat[1]?1:2; printf(" %d ",m-st+1); for(int i=st;i<=m;i++) printf("%d ",dat[i]); return 0; }
E:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=2e5+10,MAXM=4010<<1,MOD=1e9+7; ll res,fac[MAXM],inv[MAXM],dp[MAXM][MAXM],ret; int n,a[MAXN],b[MAXN],mx,mx_sum; ll quick_pow(ll a,ll b) { for(ret=1;b;b>>=1,(a*=a)%=MOD) if(b&1) (ret*=a)%=MOD; return ret; } ll C(ll a,ll b) {return fac[a]*inv[a-b]%MOD*inv[b]%MOD;} int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]), mx=max(mx,max(a[i],b[i])),mx_sum=max(mx_sum,a[i]+b[i]); for(int i=1;i<=n;i++) dp[-a[i]+mx][-b[i]+mx]++; for(int i=0;i<=(mx<<1);i++) for(int j=0;j<=(mx<<1);j++) if(dp[i][j]) (dp[i+1][j]+=dp[i][j])%=MOD,(dp[i][j+1]+=dp[i][j])%=MOD; for(int i=1;i<=n;i++) (res+=dp[a[i]+mx][b[i]+mx])%=MOD; mx_sum<<=1;fac[0]=1; for(int i=1;i<=mx_sum;i++) fac[i]=fac[i-1]*i%MOD; inv[mx_sum]=quick_pow(fac[mx_sum],MOD-2); for(int i=mx_sum;i;i--) inv[i-1]=inv[i]*i%MOD; for(int i=1;i<=n;i++) res=(res-C((a[i]+b[i])<<1,a[i]<<1)+MOD)%MOD; res=(res*(MOD+1)>>1)%MOD; printf("%lld",res); return 0; }
F:
总结和F题待填坑……
以上是关于[Atcoder Grand Contest 001] Tutorial的主要内容,如果未能解决你的问题,请参考以下文章