首页 > 其他分享 >AtCoder Beginner Contest 297

AtCoder Beginner Contest 297

时间:2023-04-11 20:44:07浏览次数:45  
标签:AtCoder cnt ch Beginner int long times 297 mod

A - Double Click

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main() {
    int n , d;
    cin >> n >> d;
    vector<int> a(n);
    for( auto & i : a ) cin >> i;
    for( int i = 1 ; i < n ; i ++ ){
        if( a[i] - a[i-1] <= d ){
            cout << a[i];
            return 0;
        }
    }
    cout << "-1\n";
    return 0;
    return 0;
}

B - chess960

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main() {
    string s;
    cin >> s;
    vector<int> v;
    for( int i = 0 ; i < 8 ; i ++ ){
        if( s[i] == 'B' ) v.push_back(i);
    }
    if( v[0] % 2 == v[1] % 2 ){
        cout << "No\n";
        return 0;
    }
    v.clear();
    for( int i = 0 ; i < 8 ; i ++ ){
        if( s[i] == 'K' || s[i] == 'R' )
            v.push_back(i);
    }
    if( s[ v[0] ] != s[ v[2] ] ){
        cout << "No\n";
        return 0;
    }
    cout << "Yes\n";
}

C - PC on the Table

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main() {
    int n , m;
    string s;
    cin >> n >> m;
    while( n -- ){
        cin >> s;
        for( int i = 1 ; i < m ; i ++ ){
            if( s[i] == 'T' && s[i-1] == 'T' )
                s[i-1] = 'P' , s[i] = 'C';
        }
        cout << s << "\n";
    }
}

D - Count Subtractions

过程其实不难理解,反复的做减法直到大小关系改变着可以直接用取模来代替。不过要注意出现倍数的情况,此事要少减一次。

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main() {
    int a, b , cnt = 0;
    cin >> a >> b;
    while (a != b) {
        if( a > b ) cnt += a / b , a %= b;
        else cnt += b / a , b %= a;
        if( min( a , b ) == 0 ) cnt -- , a = b;
    }
    cout << cnt;
}

E - Kth Takoyaki Set

我的写法其实蛮暴力的,用 set 维护前\(k\)小,在维护一个由之前的数产生的数的集合,每次选一个最小的加入到前\(k\)小中。

#include <bits/stdc++.h>

using namespace std;

#define int long long

int read(){
    int x = 0 , f = 1 , ch = getchar();
    while( (ch < '0' || ch > '9') && ch != '-' ) ch = getchar();
    if( ch == '-' ) f = -1 , ch = getchar();
    while( ch >= '0' && ch <= '9' ) x = ( x << 3 ) + ( x << 1 ) + ch - '0' , ch = getchar();
    return x * f;
}

int32_t main() {
    int n = read() , k = read();
    vector<int> a(n);
    set<int>b , c;
    for( int & i : a ) i = read() , b.insert(i);
    for( int x ;c.size() < k ; ){
        x = *b.begin() , b.erase(x);
        c.insert(x);
        for( auto i : a ){
            if( c.count( i + x ) == 0 ) b.insert( i + x );
        }
    }
    cout << *c.rbegin() << "\n";

}

F - Minimum Bounding Box 2

其实就是枚举一下矩形的大小,然后计算出这么大的矩形的贡献,计算贡献采用的是容斥原理。

荣斥可以参考下面的图片,计算方法可以直接用下面这个式子。

\[cnt( l\times r) \\ - 2cnt((l-1)\times r)-2cnt(l\times (r-1))\\ + cnt((l-2)\times r) +cnt(l\times(r-2)) + 4cnt((l-1)\times (r-1)) \\ - 2cnt((l-1)\times(r-2)) - 2cnt((l-2)\times(r-1))\\ + cnt((l-2)\times(r-2)) \]

图片来源

#include <bits/stdc++.h>

using namespace std;

#define int long long
const int N = 1e6 + 5, mod = 998244353;

int fact[N], invFact[N];

int power(int x, int y) {
    int ans = 1;
    while (y) {
        if (y & 1) ans = ans * x % mod;
        y >>= 1, x = x * x % mod;
    }
    return ans;
}

int inv(int x) {
    return power(x, mod - 2);
}

int C(int x, int y) {
    if (x < y) return 0;
    return fact[x] * invFact[x - y] % mod * invFact[y] % mod;
}

void init() {
    fact[0] = 1, invFact[0] = inv(1);
    for (int i = 1; i < N; i++)
        fact[i] = fact[i - 1] * i % mod, invFact[i] = inv(fact[i]);
    return;
}

int32_t main() {
    init();
    int n, m, k;
    cin >> n >> m >> k;
    if (k == 1) {
        cout << "1\n";
        return 0;
    }
    int ans = 0, cnt;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            cnt = 0;
            for (int u = 0; u <= 2; u++)
                for (int v = 0; v <= 2; v++) {
                    cnt += C((i - u) * (j - v), k) * (v == 1 ? -2 : 1) * (u == 1 ? -2 : 1);
                    cnt = (cnt % mod + mod) % mod;
                }
            ans = (ans + i * j % mod * (n - i + 1) % mod * (m - j + 1) % mod * cnt % mod) % mod;
        }
    cout << ans * inv(C(n * m, k)) % mod;
    return 0;
}

标签:AtCoder,cnt,ch,Beginner,int,long,times,297,mod
From: https://www.cnblogs.com/PHarr/p/17307631.html

相关文章

  • AtCoder Beginner Contest 207(D,E)
    AtCoderBeginnerContest207(D,E)D(计算几何)D这个题是两个点的集合,每个集合有\(n\)个点,我们可以让一个集合中的每一个点进行下面两种操作\(1\),可以让每一个点进行旋转\(x\)的角度\(2\),可以让每一个点的\(x\)变成\(x+disx\),\(y\)变成了\(y+disy\)问是否可以让这两个集合......
  • AtCoder Beginner Contest 247(E,F)
    AtCoderBeginnerContest247(E,F)E(思维)E这个题大意就是给一个长度为\(n\)的数组,一个\(x\)和一个\(y\),问这个数组里面可以找到多少段\([l,r]\)满足这一段里面的最大值是\(x\),最小值是\(y\)这里的做法是固定最右端,寻找最左端的可能的数量,最后相加对于每一个位置,都有作为最......
  • AtCoder Regular Contest 127
    D-LIS2难搞的地方在于取min,考虑比较\((a_i\oplusa_j,b_i\oplusb_j)\)两者的过程:是在它们第一位不一样的地方比较,取该位为0的那个。而判断两个数在某位是否相等,可以想到异或操作,然后把这两者异或起来后,由异或运算的交换律可得等价于\((a_i\oplusb_i)\oplus(a_j\oplus......
  • AtCoder Regular Contest 159
    Preface这周六紧张刺激的一日三赛,上午蓝桥杯,晚上ARC之后隔5min就是CF,可谓是手搓键盘到冒烟的一天了这场其实打的感觉很没水准,B刚开始没想清楚很多边界条件挂了三发,45min左右才过然后C的构造也不太会,随便写了个暴力也是挂挂挂,只好弃了去写D题了结果发现D题好像是个不难的线段树......
  • 练习记录- AtCoder Beginner Contest 295(D)
    vp的觉得我的D很聪明所以来写一下(乐D-ThreeDaysAgo题意就是求所有字符出现次数均为偶数的字串数量太笨了所以想了很久我把存在奇数个1当作第2位是2那么当经过了两次1 2^2这个2就变成了02就是第二位就是4...以此类推 所以我遍历一遍字符串求出当前的异或......
  • 练习记录-AtCoder Beginner Contest 296(A-F)
    vp的感觉整场挺智慧A-Alternately找有没有连续的男女#include<bits/stdc++.h>#defineclosestd::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)usingnamespacestd;typedeflonglongll;constllMAXN=3e5+7;constllmod=1e9+7;constllinf=0x3......
  • AtCoder Beginner Contest 278
    口胡一下,从青色开始E-GridFilling给定一个W×H的矩阵,每个格子有一个数,在1和N之间,给定w<=W,h<=H,对于每个满足1<=i<=W-w+1,1<=j<=H-h+1的格子(i,j),求以它为左上角的w×h矩阵被遮住后整个大矩阵还剩下几种数字。W,H,N,w,h<=300首先我们看见这个熟悉的300就知道是立方算法又注......
  • AtCoder ABC286 C - Chinese Restaurant
    AtCoderABC286C-ChineseRestaurant题目描述有\(N\)个人从\(0\)开始编号,按逆时针顺序间隔均匀地坐在转盘周围。在开始时,第\(p_i\)盘菜在第\(i\)个人的前面。现在,你可以进行以下操作\(0\)次或多次。将转盘逆时针旋转\(\dfrac{1}{N}\)圈。也就是说,旋转前......
  • AtCoder ABC295 D - Three Days Ago
    AtCoderABC295D-ThreeDaysAgo题目描述给出一个数字串,问有多少子段满足,可以以某种方式将这个子段重排,将子段分成两个完全相同的部分。样例输入输出202303224\((1,6)(1,8)(2,7)(7,8)\)都可以满足条件分析如果要满足某一个字段可以被分为两个相同的部分,则不......
  • AtCoder ABC294 F - Sugar Water 2
    AtCoderABC294F-SugarWater2题意有\(2\)排糖和水。第\(1\)排有\(N\)瓶糖和\(N\)瓶水。糖分别有\(A_i\)克,水分别有\(B_i\)克。第\(2\)排有\(M\)瓶糖和\(M\)瓶水,糖分别有\(C_i\)克,水分别有\(D_i\)克。若要从第\(1\)排糖水中找到\(A_i\)克糖和......