AtCoder Beginner Contest 160题解

A. 签到题1。

#include<bits/stdc++.h>

#define fi first
#define sd second
#define lson (nd<<1)
#define rson (nd+nd+1)
#define PB push_back
#define mid (l+r>>1)
#define MP make_pair
#define SZ(x) (int)x.size()

using namespace std;

typedef long long LL;

typedef vector<int> VI;

typedef pair<int,int> PII;

inline int read(){
    int res=0, f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+ch-‘0‘;ch=getchar();}
    return res*f;
}

const int MAXN = 200‘005;

const int MOD = 1000000007;

void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
int mulmod(int a, int b){return 1ll*a*b%MOD;}

int main(){
    string s;cin>>s;
    int ok1=s[2]==s[3];
    int ok2=s[4]==s[5];

    if(ok1&&ok2)cout<<"Yes";
    else cout<<"No";

    return 0;
}

B. 签到题2。

#include<bits/stdc++.h>

#define fi first
#define sd second
#define lson (nd<<1)
#define rson (nd+nd+1)
#define PB push_back
#define mid (l+r>>1)
#define MP make_pair
#define SZ(x) (int)x.size()

using namespace std;

typedef long long LL;

typedef vector<int> VI;

typedef pair<int,int> PII;

inline int read(){
    int res=0, f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+ch-‘0‘;ch=getchar();}
    return res*f;
}

const int MAXN = 200‘005;

const int MOD = 1000000007;

void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
int mulmod(int a, int b){return 1ll*a*b%MOD;}

int main(){
    int x;x=read();
    int ans=(x/500)*1000;
    ans+=(x-(x/500)*500)/5*5;
    cout<<ans;

    return 0;
}

C. 题意,给你一个环和一些点,可以从任意一个点出发,走遍所有点最短路程。

  显然可以丢弃一段,枚举是哪一段即可。

#include<bits/stdc++.h>

#define fi first
#define sd second
#define lson (nd<<1)
#define rson (nd+nd+1)
#define PB push_back
#define mid (l+r>>1)
#define MP make_pair
#define SZ(x) (int)x.size()

using namespace std;

typedef long long LL;

typedef vector<int> VI;

typedef pair<int,int> PII;

inline int read(){
    int res=0, f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+ch-‘0‘;ch=getchar();}
    return res*f;
}

const int MAXN = 200‘005;

const int MOD = 1000000007;

void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
int mulmod(int a, int b){return 1ll*a*b%MOD;}

int k, n;
int A[MAXN];

int main(){
    k=read();n=read();

    for(int i=0;i<n;++i)A[i]=read();

    int mx=0;

    for(int i=0;i<n;++i){
        if(i==n-1){
            mx=max(mx,k-A[n-1]+A[0]);
        }else{
            mx=max(mx,A[i+1]-A[i]);
        }
    }

    cout<<k-mx;

    return 0;
}

D. 题意,给一条链,和一条额外的边,问长度为1:N-1的最短路有多少条?

  O(n^2)枚举。

#include<bits/stdc++.h>

#define fi first
#define sd second
#define lson (nd<<1)
#define rson (nd+nd+1)
#define PB push_back
#define mid (l+r>>1)
#define MP make_pair
#define SZ(x) (int)x.size()

using namespace std;

typedef long long LL;

typedef vector<int> VI;

typedef pair<int,int> PII;

inline int read(){
    int res=0, f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+ch-‘0‘;ch=getchar();}
    return res*f;
}

const int MAXN = 2‘005;

const int MOD = 1000000007;

void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
int mulmod(int a, int b){return 1ll*a*b%MOD;}

int ans[MAXN];

int main(){
    int n, x, y;
    n=read();x=read();y=read();

    for(int i=1;i<=n;++i){
        for(int j=i+1;j<=n;++j){
            int t=min(j-i,1+abs(i-x)+abs(j-y));
            ++ans[t];
        }
    }

    for(int i=1;i<=n-1;++i){
        cout<<ans[i]<<endl;
    }

    return 0;
}

E. 要吃掉X个红苹果,Y个绿苹果,还有c个无色的苹果,每一个都有一定的价值,问最后最大价值?

  分别排序之后,把前X大和前Y大的丢进堆里,对无色的正向扫,当堆顶部的小于无色的价值时出堆。

#include<bits/stdc++.h>

#define fi first
#define sd second
#define lson (nd<<1)
#define rson (nd+nd+1)
#define PB push_back
#define mid (l+r>>1)
#define MP make_pair
#define SZ(x) (int)x.size()

using namespace std;

typedef long long LL;

typedef vector<int> VI;

typedef pair<int,int> PII;

inline int read(){
    int res=0, f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+ch-‘0‘;ch=getchar();}
    return res*f;
}

const int MAXN = 200‘005;

const int MOD = 1000000007;

void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
int mulmod(int a, int b){return 1ll*a*b%MOD;}

int a,b,c;

int x,y;

int A[MAXN], B[MAXN], C[MAXN];

priority_queue<int,vector<int>, greater<int>> q;

int main(){
    x=read();y=read();
    a=read();b=read();c=read();

    for(int i=1;i<=a;++i)A[i]=read();
    for(int i=1;i<=b;++i)B[i]=read();
    for(int i=1;i<=c;++i)C[i]=read();

    sort(A+1,A+1+a);
    sort(B+1,B+1+b);
    sort(C+1,C+1+c);

    LL ans=0;

    for(int i=a;i>=a-x+1;--i)q.push(A[i]), ans+=A[i];
    for(int i=b;i>=b-y+1;--i)q.push(B[i]), ans+=B[i];

    for(int i=c;i>=1;--i){
        if(C[i]>q.top()){
            ans-=q.top();
            q.pop();
            q.push(C[i]);
            ans+=C[i];
        }
    }

    cout<<ans;

    return 0;
}

F. 给你一颗n个节点的树,依次放入1-n,放置的条件是这条边的另一个点已经放置了数字,求把1分别放置在节点1-n的方案数。

  因为要求把1放在1-n号节点上的方案数,明示了换根dp(或许还有其他做法,但我不会嘿嘿。先考虑以把1放在一号节点的时候怎么数操作数。

  设pre[v]是以v为根的子树的安排方式数。这个时候就是一个简单的乘法原理,先选再放进子树安排。第一次dfs就能处理出所有的pre[]。在换根的时候

  我们首先要考虑到以u的儿子v为根的时候,我们首先要得到u作为v子树的pre[u]。这个显然(可能需要在纸上稍微写一下,原理就是先选再排)是ans[u]/(pre[v]*C(n-1,sz[v])),知道这个之后,得到ans[v]不过就是为u

  这个子树重新选取一些数字而已,这个显然是C(n-1,n-sz[v])种可能。根据计算u答案的方法,直接套用到v上即可,具体见代码。

#include<bits/stdc++.h>

#define fi first
#define sd second
#define lson (nd<<1)
#define rson (nd+nd+1)
#define PB push_back
#define mid (l+r>>1)
#define MP make_pair
#define SZ(x) (int)x.size()

using namespace std;

typedef long long LL;

typedef vector<int> VI;

typedef pair<int,int> PII;

inline int read(){
    int res=0, f=1;char ch=getchar();
    while(ch<‘0‘|ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){res=res*10+ch-‘0‘;ch=getchar();}
    return res*f;
}

const int MAXN = 200‘005;

const int MOD = 1000000007;

void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
int mulmod(int a, int b){return 1ll*a*b%MOD;}

#define go(e,u) for(int e=head[u];e;e=Next[e])
int to[MAXN<<1],Next[MAXN<<1],head[MAXN],tol;

void add_edge(int u,int v){
    Next[++tol]=head[u];to[tol]=v;head[u]=tol;
    Next[++tol]=head[v];to[tol]=u;head[v]=tol;
}

int ans[MAXN];

int cnt[MAXN], pre[MAXN], tp[MAXN];

int sz[MAXN];

int fac[MAXN], inv[MAXN], n;

int powmod(int x, int y){
    int res=1;
    while(y){
        if(y&1)res=1ll*res*x%MOD;
        y>>=1;
        x=1ll*x*x%MOD;
    }

    return res%MOD;
}

void init(){
    fac[1]=fac[0]=1;
    for(int i=2;i<=n;++i)fac[i]=1ll*fac[i-1]*i%MOD;
    inv[0]=inv[1]=1;
    for(int i=2;i<=n;++i)inv[i]=1ll*MOD-1ll*MOD/i*inv[MOD%i]%MOD;
    for(int i=2;i<=n;++i)inv[i]=1ll*inv[i-1]*inv[i]%MOD;
}

int C(int n, int m){
    return 1ll*fac[n]*inv[m]%MOD*inv[n-m]%MOD;
}

void dfs1(int u, int f){
    sz[u]=1;pre[u]=1;
    go(e,u){
        int v=to[e];
        if(v==f) continue;
        dfs1(v,u);
        sz[u]+=sz[v];
        pre[u]=1ll*pre[u]*pre[v]%MOD*C(sz[u]-1,sz[v])%MOD;
    }
}

void dfs2(int u, int f){
    ans[u]=1ll*tp[u]*pre[u]%MOD*C(n-1,n-sz[u])%MOD;
    go(e,u){
        int v=to[e];
        if(v==f)continue;
        tp[v]=1ll*ans[u]*powmod(1ll*pre[v]*C(n-1,sz[v])%MOD,MOD-2)%MOD;
        dfs2(v,u);
    }
}

int main(){
    n=read();
    for(int i=1;i<n;++i){
        int u, v;
        u=read();
        v=read();
        add_edge(u,v);
    }

    init();
    dfs1(1,0);
    tp[1]=1;
    dfs2(1,0);

    for(int i=1;i<=n;++i)cout<<ans[i]<<endl;

    return 0;
}
/*
8
1 2
2 3
3 4
3 5
3 6
6 7
6 8

40
280
840
120
120
504
72
72

*/

原文地址:https://www.cnblogs.com/JohnRan/p/12591555.html

时间: 2024-11-09 09:47:46

AtCoder Beginner Contest 160题解的相关文章

AtCoder Beginner Contest 154 题解

人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We have A balls with the string S written on each of them and B balls with the string T written on each of them. From these balls, Takahashi chooses one

【ATcoder】AtCoder Beginner Contest 161 题解

题目链接:AtCoder Beginner Contest 161 原版题解链接:传送门 A - ABC Swap 这题太水,直接模拟即可. 1 #include <iostream> 2 using namespace std; 3 int main() { 4 int a, b, c; 5 cin >> a >> b >> c; 6 swap(a, b); 7 swap(a, c); 8 cout << a << " &

AtCoder Beginner Contest 115 题解

题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit : 1024MB Score : 100 points Problem Statement In some other world, today is December D-th. Write a program that prints Christmas if D=25, Christmas E

AtCoder Beginner Contest 121 题解

题目链接:https://atcoder.jp/contests/abc121 A White Cells 分析:题目数据规模很小,直接暴力修改都可以.或者可以推出公式. 代码: 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int a[25][25] = {0}; 9 int H, W, h, w; 10 scanf("%d %d"

【ATcoder】AtCoder Beginner Contest 159题解

官方题解 落谷链接 ATC链接 A - The Number of Even Pairs 题意 给你两个数$n, m$代表有$n$个偶数,$m$个奇数.让你输出$n$个偶数$m$个奇数从中任选两个数(没有顺序)相加结果为偶数的个数. 题解 相加为偶数只有偶加偶和奇加奇两种情况,其实就是在$n$个数中取两个($C\binom{2}{n}$),在$m$个数中取两个($C\binom{2}{m}$). 时间复杂度$O(1)$ 1 #include <iostream> 2 using namespa

AtCoder Beginner Contest 160

传送门 A - Coffee #include <bits/stdc++.h> #define ll long long using namespace std; char s[10]; int main() { //freopen("in.txt","r",stdin); scanf("%s",s); if(s[2]==s[3]&&s[4]==s[5]) printf("Yes\n"); else

AtCoder Beginner Contest 144 题解

传送门 $cf$ 自闭了,打 $abc$ 散散心 A - 9x9 ...这个有什么好讲的吗,题目看懂就会做了 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; inline int read() { int x=0,f=1; char

Atcoder Beginner Contest 160 做题记录

A. 水题 1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[10]; 4 int main() 5 { 6 scanf("%s",s+1); 7 if(s[3]==s[4]&&s[5]==s[6])puts("Yes"); 8 else puts("No"); 9 } B. 水题 1 #include<bits/stdc++.h> 2 us

AtCoder Beginner Contest 155 简要题解

AtCoder Beginner Contest 155 A:签到失败,WA一次. int main() { int a, b, c; cin >> a >> b >> c; if(a == b && b == c) cout << "No"; else if(a == b || a == c || b == c) cout << "Yes"; else cout << &quo