[Atcoder Grand Contest 001] Tutorial

Link:

AGC001 传送门

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;
}
Problem A

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;
}
Problem B

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;
}
Problem C

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("\n%d\n",m-st+1);
    for(int i=st;i<=m;i++) printf("%d ",dat[i]);
    return 0;
}
Problem D

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;
}
Problem E

F:

总结和F题待填坑……

猜你喜欢

转载自www.cnblogs.com/newera/p/9253349.html