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

AtCoder Beginner Contest 304

时间:2023-06-03 23:36:09浏览次数:68  
标签:AtCoder cout Beginner int 304 cin long tie using

A - First Player (abc304 a)

题目大意

依次给定每个人的姓名和年龄,排成一圈。从年龄最小的人依次输出姓名。

解题思路

找到年龄最小的,依次输出就好了。

神奇的代码
#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<pair<int, string>> p(n);
    for(auto &i : p)
        cin >> i.second >> i.first;
    int st = min_element(p.begin(), p.end()) - p.begin();
    for(int i = 0; i < n; ++ i){
        cout << p[st].second << '\n';
        st = (st + 1) % n;
    }

    return 0;
}



B - Subscribers (abc304 b)

题目大意

给定一个数字,如果其超过三位数,则仅保留其最高三位,低位数字全部置为0。

解题思路

读一个string,直接赋值即可。

神奇的代码
#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;
    if (s.size() > 3)
        fill(s.begin() + 3, s.end(), '0');
    cout << s << '\n';

    return 0;
}



C - Virus (abc304 c)

题目大意

给定\(n\)个人的坐标,第一个人阳了,若两人的欧式距离\(\leq d\),其中有一个阳了,则另一个也会阳。然后继续传染。

问最终每个人是否阳了。

解题思路

从第一个人直接\(BFS\)即可。时间复杂度为 \(O(n^2)\)。

神奇的代码
#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, d;
    cin >> n >> d;
    d *= d;
    vector<array<int, 2>> p(n);
    for(auto &i : p)
        cin >> i[0] >> i[1];
    vector<int> ans(n, 0);
    ans[0] = 1;
    queue<int> team;
    team.push(0);
    auto dis = [&](int x, int y){
        return (p[x][0] - p[y][0]) * (p[x][0] - p[y][0]) + (p[x][1] - p[y][1]) * (p[x][1] - p[y][1]);
    };
    while(!team.empty()){
        int u = team.front();
        team.pop();
        for(int i = 0; i < n; ++ i){
            if (ans[i])
                continue;
            if (dis(i, u) <= d){
                ans[i] = 1;
                team.push(i);
            }
        }
    }
    for(int i = 0; i < n; ++ i)
        if (ans[i])
            cout << "Yes" << '\n';
        else 
            cout << "No" << '\n';

    return 0;
}



D - A Piece of Cake (abc304 d)

题目大意

一个\(h \times w\)的蛋糕,给定 \(n\)个草莓的位置,然后竖切 \(a\)刀,横切 \(b\)刀,给定切的位置,问切出来的 \((a+1)(b+1)\)块蛋糕中,草莓数量最少和最多分别是多少。不会把草莓切成两半。

解题思路

\(a \times b \leq 4e10\),因此不能考虑每块蛋糕。但我们可以考虑每个草莓对蛋糕的贡献。

根据草莓的位置,每个草莓仅对一块蛋糕有贡献,因此我们就遍历每块草莓,令其对应蛋糕的草莓数加一。而求是哪块蛋糕,其实就看它位于哪一刀的右边和上边(左下坐标原点)即可,二分就可以找到。

最后看最大值和最小值即可。因为蛋糕的草莓数量是稀疏的,我们可以用 map记录,最后看map里的元素个数是否等于\((a+1)(b+1)\),不等于说明有的蛋糕没有草莓。

神奇的代码
#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 w, h, n, a, b;
    cin >> w >> h >> n;
    vector<array<int, 2>> s(n);
    for(auto &i : s)
        cin >> i[0] >> i[1];
    cin >> a;
    vector<int> vec(a);
    for(auto &i : vec)
        cin >> i;
    cin >> b;
    vector<int> hor(b);
    for(auto &i : hor)
        cin >> i;
    map<LL, int> cnt;
    int minn = n + 1, maxx = 0;
    auto check = [&](int x, int y){
        int pos1 = upper_bound(vec.begin(), vec.end(), x) - vec.begin();
        int pos2 = upper_bound(hor.begin(), hor.end(), y) - hor.begin();
        return 1ll * (a + 1) * pos2 + pos1;
    };
    for(auto &[x, y]: s){
        LL id = check(x, y);
        cnt[id] ++;
    }
    for(auto &[_, v] : cnt){
        minn = min(minn, v);
        maxx = max(maxx, v);
    }
    if (cnt.size() < 1ull * (a + 1) * (b + 1))
        minn = 0;
    cout << minn << ' ' << maxx << '\n';

    return 0;
}



E - Good Graph (abc304 e)

题目大意

给定一张无向图,有\(k\)个限制,第 \(i\)个限制表示 点\(x_i\)和 点\(y_i\) 不能相互到达。原图满足这\(k\)条限制。

依次回答\(q\)个独立的询问,每个询问添加一条边\((u,v)\)后,是否还满足这 \(k\)个限制。

解题思路

题意相当于给了若干个连通块,然后要求一些连通块之间不能相互到达,然后问增加的边,是否导致两个不该连通的连通块连通。

那就给每个连通块标个号,然后把不能连通的连通块编号用set存起来,每个询问就问这条边的两个点所在的连通块标号是否在这个set里即可。

连通块标号、查点所在的连通块,用并查集即可。

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

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

    dsu(int _n) : n(_n) {
        p.resize(n);
        iota(p.begin(), p.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);
        if (x != y) {
            p[x] = y;
            return true;
        }
        return false;
    }
};

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);
    }
    int k;
    cin >> k;
    set<array<int, 2>> forbid;
    for(int i = 0; i < k; ++ i){
        int u, v;
        cin >> u >> v;
        -- u, -- v;
        int fu = d.get(u), fv = d.get(v);
        assert(fu != fv);
        if (fu > fv)
            swap(fu, fv);
        forbid.insert({fu, fv});
    }
    int q;
    cin >> q;
    while(q--){
        int u, v;
        cin >> u >> v;
        -- u, -- v;
        int fu = d.get(u), fv = d.get(v);
        if (fu > fv)
            swap(fu, fv);
        if (forbid.find({fu, fv}) == forbid.end()){
            cout << "Yes" << '\n';
        }else{
            cout << "No" << '\n';
        }
    }

    

    return 0;
}



F - Shift Table (abc304 f)

题目大意

给定高桥的\(n\)天值班情况。

问满足下述条件的青木的\(n\)天值班情况数量,满足每天他俩至少有一人值班,且青木的值班情况是关于\(m | n\)循环的,其中 \(m < n\)。

解题思路

<++>

神奇的代码



G - Max of Medians (abc304 g)

题目大意

<++>

解题思路

<++>

神奇的代码



Ex - Constrained Topological Sort (abc304 h)

题目大意

<++>

解题思路

<++>

神奇的代码



标签:AtCoder,cout,Beginner,int,304,cin,long,tie,using
From: https://www.cnblogs.com/Lanly/p/17454999.html

相关文章

  • Beginner:Client libraries-10 创建并使用插件
    目标:学习创建和加载一个简单的插件使用pluginlib背景本教程来自于 http://wiki.ros.org/pluginlib and WritingandUsingaSimplePluginTutorial.pluginlib是一个c++库,用于从ROS包中加载和卸载插件。插件是从运行库(即共享对象、动态链接库)加载的可动态加载类。使用plugi......
  • Beginner:Client libraries-9 使用ros2doctor识别问题
    目标:在ros2系统中通过ros2doctor工具来识别问题。背景当ros2系统没有按预期运行,可以通过ros2doctor来检查设置。ros2doctor检查ros2的所有方面,包括平台,版本,网络,环境,运行系统等等,警告你可能的错误和问题的原因。ros2doctor是ros2cli的一部分。只要ros2cli按照常规安装,就可以使......
  • Beginner:Client libraries-8 在类中使用参数
    目标:创建和运行一个具有ROS参数的类背景当实现自己节点的时候,可能需要从launch文件中添加参数。本教程的目的是告诉你怎样在c++类中创建这些参数,以及怎样在launch文件中设置。任务1、创建一个包ros2pkgcreate--build-typeament_cmakecpp_parameters--dependenciesrcl......
  • Beginner:Client libraries-7实现自定义接口
    目标:在ROS2中学习更多的实现自定义接口背景在指定的接口包中声明接口,有时在一个包中声明、创建、使用所有接口很方便。本教程关注msg接口类型,但是步骤对于其他所有接口类型适用。任务1、创建一个包ros2pkgcreate--build-typeament_cmakemore_interfacesmkdirmore_in......
  • AtCoder Beginner Contest 286(G)
    AtCoderBeginnerContest286(G)G(欧拉路径)G题意大致为\(n\)个点,\(m\)个边的图,然后给出\(k\)条边的编号,问我们这\(k\)条边可不可以在一条路径上(每条边都可以经过)对于可不可以存在一条路径,里面包含个题目所给的\(k\)条边,其实就是问是否存在一条路可以经历这\(k\)条边,然后我们......
  • Beginner:Client libraries-3 创建一个包
    目标:使用CMake或者Python来创建一个新的包,运行可执行程序;背景1、ROS2的包是什么一个包是作为ROS2代码的组织单元。如果你想安装你的代码或与他人共享,那么你需要将其组织在一个包中。有了软件包,您可以发布您的ROS2作品,并允许其他人轻松构建和使用它。在ROS2中包的创建使用amen......
  • Beginner:Client libraries-2 创建工作空间
    目标:创建一个工作空间,学习如何设置开发和测试覆盖层(overlay)。背景工作空间是一个包含了ROS2的包的路径,在使用ros2之前首先需要source相应的ROS2工作空间来使用对应的包。overlay是一个可以添加新的包而不影响现有ROS2工作区,即underlay的工作空间;underlay中包含着overlay的依......
  • Beginner:Client libraries-1 使用colcon编译包
    目标:用colcon编译一个ROS2工作空间。这是一个关于如何使用colcon创建和构建ROS2工作区的简短教程。背景colcon是ROS编译工具catkin_make, catkin_make_isolated, catkin_tools and ament_tools的替代。安装colconsudoaptinstallpython3-colcon-common-extensions基......
  • ROS2-Beginner:9-启动节点
    目标:使用命令行工具来启动多个节点背景在大多数入门教程中,您一直在为运行的每个新节点打开新的终端。当您创建越来越多节点同时运行的更复杂的系统时,打开终端和重新输入配置细节会变得乏味。launch文件允许您同时启动和配置包含ROS2节点的许多可执行文件。使用ros2-launch命......
  • ROS2-Beginner:10-记录和播放数据
    目标:记录发布到话题上的数据,可以任何时候回放和检查。背景ros2-bag是一个命令行工具,用于记录系统中主题发布的数据。它累积在任意数量的主题上传递的数据,并将其保存在数据库中。然后,您可以回放数据以重现测试和实验的结果。录制主题也是分享你的作品并允许他人重新创作的好方法......