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

AtCoder Beginner Contest 292

时间:2023-03-04 22:46:18浏览次数:60  
标签:AtCoder cnt cout Beginner int cin long using 292

A - CAPS LOCK (abc292 a)

题目大意

给定一个小写字母串,将其转换成大写字母。

解题思路

调库,或者按照ascii码转换即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    string s;
    cin >> s;
    for(auto &i : s)
        i = toupper(i);
    cout << s << endl;

    return 0;
}



B - Yellow and Red Card (abc292 b)

题目大意

\(n\)个人, \(m\)个事件,分三种:给某人黄牌,给某人红牌,问某人是否被罚下场。

如果一人被罚两张黄牌或一张红牌则被罚下场。

回答每个询问。

解题思路

按照题意,维护每个人的黄牌和红牌数量模拟即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, q;
    cin >> n >> q;
    vector<vector<int>> cnt(2, vector<int>(n, 0));
    while(q--){
        int c, x;
        cin >> c >> x;
        c --;
        x --;
        if (c == 2){
            if (cnt[0][x] < 2 && cnt[1][x] < 1)
                cout << "No" << '\n';
            else 
                cout << "Yes" << '\n';
        }else 
            cnt[c][x] ++;
    }

    return 0;
}



C - Four Variables (abc292 c)

题目大意

给定\(n\),问有多少正整数组\((A,B,C,D)\),满足 \(AB + CD = n\)

解题思路

给定\(X\),预处理\(AB=X\) 的方案数\(cnt[X]\)。

然后枚举\(AB\)的乘积 \(X\),则 \(CD\)的乘积为 \(n-X\),其两个方案数相乘\(cnt[X] \times cnt[n - X]\)。然后累加即是答案。

时间复杂度为 \(O(n\log n)\)

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n;
    cin >> n;
    vector<int> cnt(n + 1);
    for(int i = 1; i <= n; ++ i)
        for(int j = 1; j <= n; ++ j){
            if (1ll * i * j > n)
                break;
            cnt[i * j] ++;
        }
    LL ans = 0;
    for(int i = 1; i < n; ++ i)
        ans += 1ll * cnt[i] * cnt[n - i];
    cout << ans << '\n';

    return 0;
}



D - Unicyclic Components (abc292 d)

题目大意

给定一张无向图,问每个连通块是否满足:其边数点数相等。

解题思路

并查集维护连通性,同时维护连通块的边数点数,最后一一判断即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

class dsu {
    public:
    vector<int> p;
    vector<int> psz;
    vector<int> esz;
    int n;

    dsu(int _n) : n(_n) {
        p.resize(n);
        psz.resize(n);
        esz.resize(n);
        iota(p.begin(), p.end(), 0);
        fill(psz.begin(), psz.end(), 1);
        fill(esz.begin(), esz.end(), 0);
    }

    inline int get(int x) {
        return (x == p[x] ? x : (p[x] = get(p[x])));
    }

    inline bool unite(int x, int y) {
        x = get(x);
        y = get(y);
        esz[y] ++;
        if (x != y) {
            p[x] = y;
            psz[y] += psz[x];
            esz[y] += esz[x];
            return true;
        }
        return false;
    }
    inline bool check(){
        for(int i = 0; i < p.size(); ++ i){
            if (get(i) == i && psz[i] != esz[i]){
                return false;
            }
        }
        return true;
    }
};

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    dsu d(n);
    for(int i = 0; i < m; ++ i){
        int u, v;
        cin >> u >> v;
        -- u, -- v;
        d.unite(u, v);
    }
    if (d.check())
        cout << "Yes" << '\n';
    else 
        cout << "No" << '\n';

    return 0;
}



E - Transitivity (abc292 e)

题目大意

给定一张有向图。如果对于三个点\((a,b,c)\), \(a->b\), \(b->c\),则必须有边\(a->c\) 。

问最少添加多少条边,使得对于任意三个点,都满足以上性质。

解题思路

考虑一条链,从左连到右,容易发现左边的点与右边的每个点都要连一条边。

即从一个点出发,它能到达的所有点,在最终的图都要与其连边。

因此从每个点\(BFS\),求得其能到达的所有点数。对所有点累加即是最终图的边数,减去已有的边数,则是需要添加的最小边数。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> edge(n);
    for(int i = 0; i < m; ++ i){
        int u, v;
        cin >> u >> v;
        -- u, -- v;
        edge[u].push_back(v);
    }
    int ans = 0;
    auto bfs = [&](int st){
        queue<int> team;
        team.push(st);
        int cnt = 0;
        vector<int> visit(n, 0);
        visit[st] = 1;
        while(!team.empty()){
            auto u = team.front();
            team.pop();
            for(auto &v : edge[u]){
                if (!visit[v]){
                    ++ cnt;
                    team.push(v);
                    visit[v] = 1;
                }
            }
        }
        return cnt;
    };
    for(int i = 0; i < n; ++ i)
        ans += bfs(i);
    ans -= m;
    cout << ans << '\n';

    return 0;
}



F - Regular Triangle Inside a Rectangle (abc292 f)

题目大意

给定一个矩阵,问其内接的最大正三角形的边长是多少。

解题思路

从样例的图我们可以进行猜测:

  • 三角形的一个顶点在矩形的顶点上
  • 当矩形的长不够长时,三角形的另外两个点都在矩形的边上。

example

设\(15^\circ\)的角为 \(\theta\),矩形长\(a\),宽 \(b\)(\(a > b\)),三角形边长 \(x\),根据正三角形边相等和高中数学知识可得

\[x = \frac{a}{\cos \theta} = \frac{b}{\cos(30^{\circ} - \theta)} \]

用和角公式将\(\cos(30^{\circ} - \theta)\)拆开,然后解方程得到

\[\tan \theta = \frac{2b}{a} - \sqrt{3} \]

因为这里\(0 \leq \theta \leq 30^\circ\),所以 \(\tan \theta\)应该大于 \(0\)。因此这里就有个边界条件 \(\frac{2b}{a} > \sqrt{3}\)

一旦不满足,说明长 \(a\)太大了,此时三角形最大的情况,就是其高和矩形的宽相等,即三角形的边长就是 \(x = \frac{2b}{\sqrt{3}}\)

否则,算得\(\cos \theta = \sqrt{ \frac{1}{1 + tan^2 \theta}}\),\(x = \frac{a}{cos \theta}\)

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int a, b;
    cin >> a >> b;
    if (a < b)
        swap(a, b);
    long double sq3 = sqrt(3);
    if (2.0 * b / a < sq3){
        double x = b / sq3 * 2;
        cout << fixed << setprecision(15) << x << '\n';
    }else {
        long double tan = 2.0 * b / a - sq3;
        long double cos = sqrt(1 / (1 + tan * tan));
        long double x = a / cos;
        cout << fixed << setprecision(15) << x << '\n';
    }

    return 0;
}



G - Count Strictly Increasing Sequences (abc292 g)

题目大意

给定\(n\)个长度为 \(m\)的包含数字和 ?的字符串。

将这些 ?替换数字。问有多少种替换方案,满足\(s_0 < s_1 < s_2 < ... < s_{n-1}\)

解题思路

应该是个数位\(DP\)

神奇的代码



Ex - Rating Estimator (abc292 h)

题目大意

<++>

解题思路

<++>

神奇的代码



标签:AtCoder,cnt,cout,Beginner,int,cin,long,using,292
From: https://www.cnblogs.com/Lanly/p/17179400.html

相关文章

  • AtCoder Beginner Contest 252
    AtCoderBeginnerContest252D题意在数组中形如\(1\leqi<j<k\leqn\)使得\(a_i,a_j,a_k\)互不相同,求共有多少组满足条件思路它的数据范围\(1\leqa_i\leq2*10^5\)......
  • AtCoder Beginner Contest 251
    AtCoderBeginnerContest251D给定一个1e6范围内的数n,要你构造出一个数组,对于1~n中的任何一个数都能用数组中最多三个数的和加起来。这题真的是很好的一道思维题,想了我......
  • AtCoder Regular Contest 155
    期末考完复健,补一下一个月前打的ARC当时赛后9秒过D,太痛了,第一次体验这种只能说,幸好当时要打的时候感觉状态不行,就unrated了比赛的状况是:A不知道哪错了;C不会;D博弈DP原......
  • AtCoder Beginner Contest 291(Sponsored by TOYOTA SYSTEMS)(D,E,F)
    AtCoderBeginnerContest291(SponsoredbyTOYOTASYSTEMS)(D,E,F)DD又一次误解题意这个题的要求是相邻的两个数不同,而我的翻译上是整个数列的数都是不同的(ಥ﹏ಥ)大意是......
  • AtCoder Beginner Contest 275 A-F 题解
    比赛链接砳赫賏,看懂扣1(A-FindTakahashi模拟。#include<cstdio>#include<algorithm>usingnamespacestd;intn,mx,id=1;intmain(){ intx; scanf("%d......
  • Atcoder ARC084D Small Multiple
    \(O(k)/O(k)\)解法标签:建图最短路考虑对于一个数\(x\),考虑由它在末尾改变能产生哪些状态:\(x+1\),此时对应的数位和\(+1\)\(x\times10\),对应数位和不变那直接把......
  • [AtCoder Grand Contest 060][C. Large Heap]
    看了几篇题解都是从下往上(子树大小从小到大)推的,来整一个从上往下的。题目链接:C-LargeHeap题目大意:称一个大小为\(2^N-1\)的排列是好排列当且仅当其满足对任意\(1\l......
  • AtCoder Beginner Contest 280 A-F 题解
    比赛链接A-PawnonaGrid模拟。#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintN=15;intn,m,ans;chars[N];i......
  • AtCoder Beginner Contest 279 A-E 题解
    比赛链接A-wwwvvvvvv直接模拟#include<cstdio>#include<cstring>constintN=105;intn,ans;chars[N];intmain(){ scanf("%s",s+1); for(inti=1......
  • AtCoder Beginner Contest 291 A-F 题解
    。。。比赛链接A-camelCase直接循环判断。#include<cstdio>#include<cstring>constintN=20;chars[N];intmain(){ scanf("%s",s+1); for(inti=1;......