AtCoder ABC215

题目地址
本期难度适中

C - One More aab aba baa

简单题,stl中next_permutation会用就行

/*
 * @Author: C.D.
 * @Date: 2024-02-23 11:20:19
 * @LastEditors: C.D.
 * @LastEditTime: 2024-03-05 16:47:57
 * @FilePath: \atcoder\atcoder.cpp
 *
 * Copyright (c) 2024 by C.D./tongwoo.cn, All Rights Reserved.
 */

#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;



int main()
{
    //freopen("in.txt", "r", stdin);
    string s;
    int n;
    cin >> s >> n;
    sort(s.begin(), s.end());
    // cout << s << endl;
    set<string> ss;
    do {
        ss.insert(s);
    } while(next_permutation(s.begin(), s.end()));
    vector<string> vs;
    for (auto str: ss) vs.push_back(str);
    sort(vs.begin(), vs.end());
    cout << vs[n - 1] << endl;
    return 0;
}

D - Coprime 2

简单数论题,对a数组分解质因数,再枚举k

/*
 * @Author: C.D.
 * @Date: 2024-02-23 11:20:19
 * @LastEditors: C.D.
 * @LastEditTime: 2024-03-05 16:55:02
 * @FilePath: \atcoder\atcoder.cpp
 *
 * Copyright (c) 2024 by C.D./tongwoo.cn, All Rights Reserved.
 */

#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

int n, m;
bool vis[100020];
set<int> p;

void insert(int x) {
    for (int i = 2; i * i <= x; ++ i) {
        while(x % i == 0) {
            p.insert(i);
            x /= i;
        }
    }
    if(x != 1) {
        p.insert(x);
    }
}


int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++ i) {
        int t;
        scanf("%d", &t);
        insert(t);
    }
    for (auto x: p) {
        for (int i = 1; i * x <= m; ++ i) {
            vis[i * x] = 1;
        }
    }
    int cnt = 0;
    for (int i = 1; i <= m; ++ i) {
        if(!vis[i]) cnt ++;
    }
    printf("%d\n", cnt);
    for(int i = 1; i <= m; ++ i) {
        if(!vis[i]) printf("%d\n", i);
    }
    return 0;
}

E - Chain Contestant

二维的dp方程看不懂,写个三维的
A-J映射到0-9
f ( i , m a s k , j ) f(i,mask,j) f(i,mask,j)代表当前搜到的位置为i,前面i位组成的bitmask为mask,最后一个参加的比赛为j
不选: f ( i , m a s k , j ) + = f ( i − 1 , m a s k , j ) f(i,mask,j)+=f(i-1,mask,j) f(i,mask,j)+=f(i1,mask,j)
选并且前一个是j f ( i , m a s k , j ) + = f ( i − 1 , m a s k , j ) f(i,mask,j)+=f(i-1,mask,j) f(i,mask,j)+=f(i1,mask,j)
选并且前一个不是j f ( i , m a s k , j ) + = ∑ f ( i − 1 , p r e , k ) f(i,mask,j)+= \sum f(i-1, pre,k) f(i,mask,j)+=f(i1,pre,k)
其中 p r e pre pre是去掉当前的j后的位编码.

/*
 * @Author: C.D.
 * @Date: 2024-02-23 11:20:19
 * @LastEditors: C.D.
 * @LastEditTime: 2024-03-07 09:29:57
 * @FilePath: \atcoder\atcoder.cpp
 *
 * Copyright (c) 2024 by C.D./tongwoo.cn, All Rights Reserved.
 */

#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

ll mod = 998244353;
ll f[1002][1024][10];
int a[1002];
int n;

void inline add_mod(ll &x, ll add){
    x = (x + add) % mod;
}


int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    char s[1001];
    scanf("%s", s);
    for(int i = 0; i < n; ++ i) {
        a[i + 1] = s[i] - 'A';
    }
    
    for (int i = 1; i <= n; ++ i) {
        for(int j = 0; j < 1024; ++ j) {
            for (int k = 0; k < 10; ++ k) {
                if(((j >> k) & 1) == 0) continue;
                if(a[i] != k) {
                    add_mod(f[i][j][k], f[i - 1][j][k]);
                } else {
                    int pre = j ^ (1 << k);
                    add_mod(f[i][j][k], f[i - 1][j][k] * 2);
                    if(pre == 0) {
                        add_mod(f[i][j][k], 1);
                    } else {
                        for(int l = 0; l < 10; ++ l){
                            if(l != k) add_mod(f[i][j][k], f[i - 1][pre][l]);
                        }
                    }
                }
            }
            
        }
    }
    ll ans = 0;
    for(int i = 1; i < 1024; ++ i) {
        for(int j = 0; j < 10; ++ j) {
            add_mod(ans, f[n][i][j]);
        }
    }
    printf("%lld\n", ans);
    return 0;
}

F - Dist Max 2

最小值求最大值,二分
这里求 G = min ⁡ ( ∣ x i − x j ∣ , ∣ y i − y j ∣ ) G=\min(\lvert x_i-x_j \rvert, \lvert y_i-y_j \rvert) G=min(∣xixj,yiyj∣)的最大值,
也就是求 G ≥ g G \ge g Gg成立下 max ⁡ g \max g maxg
即判断 ∀ i , j \forall i,j i,j ∣ x i − x j ∣ ≥ g \lvert x_i-x_j \rvert \ge g xixjg ∣ y i − y j ∣ ≥ g \lvert y_i-y_j \rvert \ge g yiyjg是否成立
这里可以对x排序然后采用滑动窗口的方法

/*
 * @Author: C.D.
 * @Date: 2024-02-23 11:20:19
 * @LastEditors: C.D.
 * @LastEditTime: 2024-03-07 14:12:54
 * @FilePath: \atcoder\atcoder.cpp
 *
 * Copyright (c) 2024 by C.D./tongwoo.cn, All Rights Reserved.
 */

#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

struct Node{
    int x, y;
};

Node a[200020];
int lmin[200020], lmax[200020];
int rmin[200020], rmax[200020];
int n;


bool check(ll val){
    int i = 0, j = -1;
    while(i < n && j < n) {
        while(j + 1 < n && abs(a[i].x - a[j + 1].x) < val){
            j += 1;
        }
        //printf("%d %d\n", i, j);
        if(j + 1 < n) {
            if(abs(lmax[i] - rmin[j + 1]) >= val) return true;
            if(abs(lmin[i] - rmax[j + 1]) >= val) return true;
        }
        i += 1;
    }
    return false;
}


int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    for(int i = 0; i < n; ++ i) {
        int x, y;
        scanf("%d%d", &x, &y);
        a[i] = Node({x, y});
    }
    sort(a, a + n, [&](Node lhs, Node rhs) {
        return lhs.x < rhs.x;
    });
    lmin[0] = lmax[0] = a[0].y;
    for(int i = 1; i < n; ++ i) {
        lmin[i] = min(lmin[i - 1], a[i].y);
        lmax[i] = max(lmax[i - 1], a[i].y);
    }
    rmin[n - 1] = rmax[n - 1] = a[n - 1].y;
    for(int i = n - 2; i >= 0; -- i) {
        rmin[i] = min(rmin[i + 1], a[i].y);
        rmax[i] = max(rmax[i + 1], a[i].y);
    }
    //check(1);
    ll lo = 0, hi = 1e10;
    while(lo < hi) {
        ll mi = (lo + hi) / 2;
        bool ret = check(mi);
        if(ret) lo = mi + 1;
        else hi = mi;
    }
    printf("%lld\n", lo - 1);
    return 0;
}

G - Colorful Candies 2

每个球取是独立事件,因此求取颜色期望数,可以单独计算n个球里面取k个,取到每个颜色的期望,再加起来
E ( k ) = ∑ ( C n k − C n − c i k C n k ) E(k)=\sum(\frac{C_n^k-C_{n-ci}^k}{C_n^k}) E(k)=(CnkCnkCncik)
其中ci是每个颜色的数量
但是颜色也很多,整个算法 O ( N 2 ) O(N^2) O(N2)
可以发现 相同数量的可以合并,于是算法复杂度就降下来了

/*
 * @Author: C.D.
 * @Date: 2024-02-23 11:20:19
 * @LastEditors: C.D.
 * @LastEditTime: 2024-03-08 10:25:16
 * @FilePath: \atcoder\atcoder.cpp
 *
 * Copyright (c) 2024 by C.D./tongwoo.cn, All Rights Reserved.
 */

#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

int n;
map<int, int> a;    // [颜色数量ci,颜色数量为ci的有几个]
int m;
map<int, int> cnt;

ll mod = 998244353;
ll fac[50005], inv[50005];


ll qpow(ll a, ll x) {
    if(x == 0) return 1ll;
    ll t = qpow(a, x >> 1);
    if(x & 1) return t * t % mod * a % mod;
    else return t * t % mod;
}


void init() {
    fac[0] = fac[1] = 1;
    for(int i = 2; i <= n; ++ i) {
        fac[i] = fac[i - 1] * i % mod;
    }
    inv[n] = qpow(fac[n], mod - 2);
    for (int i = n - 1; i >= 0; -- i) {
        inv[i] = inv[i + 1] * (i + 1) % mod;
    }
}

ll cmb(ll x, ll y) {
    if(x < y) return 0;
    return fac[x] * inv[y] % mod * inv[x - y] % mod;
}


int main()
{
    //freopen("in.txt", "r", stdin);
    scanf("%d", &n);
    init();
    ll a0 = cmb(4, 1);
    
    for(int i = 0; i < n; ++ i) {
        int x;
        scanf("%d", &x);
        cnt[x] ++;
    }

    for (auto it: cnt) {
        a[it.second] ++;
    }

    for (int k = 1; k <= n; ++ k) {
        ll ans = 0;
        for (auto it: a) {
            ll ci = it.first, t = it.second;
            ll ret = (cmb(n, k) - cmb(n - ci, k) + mod) % mod;
            ret = ret * fac[n - k] % mod * fac[k] % mod * inv[n] % mod;
            ret = (ret * t) % mod;
            ans = (ans + ret) % mod;
        }
        printf("%lld\n", ans);
    }
    return 0;
}
  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: atcoder beginner contest 235 是一场由 AtCoder 组织的初学者比赛,旨在为初学者提供一个锻炼自己编程能力的平台。比赛通常包括多个问题,参赛者需要在规定时间内解决这些问题。比赛难度逐渐增加,从而帮助参赛者提高自己的编程技能。 ### 回答2: ATCoder Beginner Contest 235(简称ABC 235)是一项由ATCoder举办的编程竞赛。该比赛旨在为初学者提供一个机会展示他们的编程技巧和解决问题的能力。 ABC 235通常由4个问题组成,题目难度递增。参赛者需要在规定的时间内使用编程语言解决这些问题。这些问题通常涵盖了各种编程相关的主题,例如数学问题、字符串处理、排序和搜索算法等。 在比赛开始前,参赛者将获得一份题目说明文档和输入样例。他们需要根据题目要求编写程序,处理给定的输入数据,并生成相应的输出。比赛时间一般为2-3小时,参赛者需要尽可能快速且准确地解决问题。 评判将根据参赛者的程序输出与预期结果的一致性进行。参赛者可以在比赛过程中提交多次解答,但只有第一次正确答案会被记入最终的成绩。 ABC 235不仅提供了一个竞赛平台,还鼓励参赛者通过讨论和分享解题思路来学习和提高。在比赛结束后,ATCoder将提供详细的解题分析和解题报告,帮助参赛者了解每个题目的最佳解决方法,并提供参考答案和示例代码。 通过参加ATCoder Beginner Contest 235,参赛者可以提升他们的编程技能,锻炼逻辑思维能力,并与全球的编程爱好者交流。无论是初学者还是有经验的编程者,ABC 235都是一个很好的学习和挑战的机会。 ### 回答3: AtCoder Beginner Contest 235 是一个在 AtCoder 上的初级比赛。该比赛通常会吸引很多新手程序员参加。它由 AtCoder 组织主办,旨在帮助新手提高编程技能以及在竞赛中锻炼自己。 比赛的题目难度由易到难,共有四个问题。通常,第一个问题是一个简单的数学问题,要求解决一个简单的算术运算。第二个问题可能是一个字符串操作问题,需要对给定的字符串进行处理。第三个问题可能是一个动态规划或贪心算法问题,需要细心分析问题,找出最优解。最后一个问题通常是一个较难的图论或组合问题,需要一些高级算法来解决。 参赛选手在比赛开始后有一定的时间限制来解决这些问题。他们可以使用自己熟悉的编程语言来实现解决方案。然后他们将自己的程序提交到 AtCoder 的在线评测系统中进行评测。评测结果会即时显示,并将参赛选手的成绩排名和讨论解答过程的视频分享给其他选手。 参加 AtCoder Beginner Contest 235 对于新手来说是一个很好的机会。通过解决这些问题,他们可以练习编程技巧,提高解决问题的能力。比赛结束后,他们还可以看到其他选手的解答,学习他们的思路和方法。同时,比赛的排名和奖励也是一种鼓励和激励新手继续努力学习的方式。 总之,AtCoder Beginner Contest 235 是一个对于新手非常友好的比赛,它提供了一个锻炼和展示编程技能的平台。无论是对于新手还是更有经验的选手,参加这样的比赛都是一个宝贵的机会。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值