锦惺 发表于 2025-6-2 23:21:54

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(9)

比赛链接
本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。
跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18869039
开题 + 补题情况

最近一直在准备期中考试,好久没写代码了,这场有点糖,前一个小时一题没开,实属红温,尤其是 1007,想了好久好久。
下周打南昌,自己第一次参加全国性的比赛,希望自己加油发挥吧!

1010 - 绳子切割

此题考查并查集(实际暴力也可以)。
我们删点是从大到小删,那么倒过来就是加点,加点就是从小到大加。
对于每一个点,连向比它小的结点的连通块,看是否能和 \(0\) 在同一块,如果不在,那么直接输出 \(0\),因为这个时候,它不和横梁同属一个连通块,说明它到 \(0\) 之间有点被删除了,进而导致该点被提前删除了。
点击查看代码#include <bits/stdc++.h>
#define inf32 1e9
#define inf64 2e18
#define ls o << 1
#define rs o << 1 | 1

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned int;

const int N = 2e5 + 9;

struct DSU {
    std::vector<int> fa;

    DSU(int n) {
      fa.resize(n + 1);
      std::iota(fa.begin(), fa.end(), 0);
    }

    int root(int x) {
      return (fa == x) ? x : (fa = root(fa));
    }

    void merge(int u, int v) {
      if(root(u) == 0) {
            fa = root(fa);
      } else {
            fa = root(fa);
      }
    }
};

void solve()
{
    int n, m;std::cin >> n >> m;
    DSU dsu(n);

    std::vector<std::vector<int>> g(n + 1);

    for(int i = 1;i <= m;i ++) {
      int u, v;std::cin >> u >> v;

      g.push_back(v);
      g.push_back(u);
    }

    for(int i = 1;i <= n;i ++) {
      for(auto &x : g) {
            if(i < x)continue;
            dsu.merge(i, x);
      }

      if(dsu.root(i) != 0) {
            std::cout << 0 << '\n';
            return;
      }
    }

    std::cout << 1 << '\n';
}

int main()
{
    std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);

    int t = 1;std::cin >> t;
    while(t --)solve();

    return 0;
}1005 - 真爱口上

这个题看似是一个非常恶心的模拟题,但是题目有一个很重要的信息:所有的字符串都是符合规则的音节序列。也就意味着我们不需要判断串的合法性,只需要根据特征计数就行了。

[*]基本音节结构:不难发现,一定是以元音结尾,因此只需要计算元音有多少个即可。
[*]鼻音:单算 nn 相连的情况,特别注意比如 nnna 的情况,此时不能算为两个鼻音。
[*]促音:计算 pp tt kk ss 的数量即可。
点击查看代码#include <bits/stdc++.h>
#define inf32 1e9
#define inf64 2e18
#define ls o << 1
#define rs o << 1 | 1

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned int;

const int N = 2e5 + 9;

template<typename T>
T up(T x, T y) {
    return (x + y - 1) / y;
}

void solve()
{
    int v, w;std::cin >> v >> w;
    int h = w / 2 + 1;
    int l = w - h;

    int sum = v / h;
    v -= sum * h;

    int ans = 0;
    if(sum) {
      if(v > l)ans = sum + 1;
      else ans = sum;
    } else {
      ans = 1;
    }

    std::cout << ans << '\n';
}

int main()
{
    std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);

    int t = 1;std::cin >> t;
    while(t --)solve();

    return 0;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(9)