【Acwing 周赛复盘】第92场周赛复盘(2023.2.25)

news2024/9/22 21:12:41

【Acwing 周赛复盘】第92场周赛复盘(2023.2.25)

周赛复盘 ✍️

本周个人排名:1293/2408

AC情况:1/3

这是博主参加的第七次周赛,又一次体会到了世界的参差(这次周赛记错时间了,以为 19:15 开始,不然 T3 应该也能 AC,就差一点 😂)

T1 签到题。✅

T2 没啥思路,就跳过去做 T3 了。❌ (经过y总讲解后,发现这是一道非常精妙,涉及树的前序遍历的递归题,值得反复咀嚼)

T3 题意有点绕,但是读明白之后,就是一道并查集的变形题目,但是融合了一点贪心思想。在看样例1时,以为只要输出最大集合的元素个数就行了;但是模拟样例2时发现,不对啊,这后面几个输出怎么和自己想的不一样呢。于是就开始模拟样例2的过程,但是中途却卡壳了许久,有几个输出一直没想明白。等完全想明白时,比赛时间已经到了。❌

希望未来也能继续努力,紧跟大佬们的步伐,继续加油 💪

image-20230225212919384


周赛信息 📚

时间:2023年 2 月 25 日 19:00-20:15

竞赛链接: https://www.acwing.com/activity/content/2908/

y总直播间:http://live.bilibili.com/21871779

y总录播讲解视频:【AcWing杯 - 第 92 场周赛讲解】


题目列表 🧑🏻‍💻

题目名称原题链接视频讲解难度
AcWing 4864. 多边形原题链接视频链接简单 🟢
AcWing 4865. 有效类型原题链接视频链接中等 🟡
AcWing 4866. 最大数量原题链接视频链接困难 🔴

题解 🚀

【题目A】多边形

【题目描述】

如果一个正多边形的边数 n n n 能被 4 4 4 整除,那么就称该正多边形是美丽的。

现在,给定一个正多边形的边数 n n n,请你判断它是否是美丽的。

【输入】

第一行包含整数 T T T,表示共有 T T T 组测试数据。

每组数据占一行,包含一个整数 n n n

【输出】

每组数据输出一行结果,如果给定正多边形是美丽的,则输出 YES,否则输出 NO

【数据范围】

3 3 3 个测试点满足 1 ≤ T ≤ 10 1 \le T \le 10 1T10

所有测试点满足 1 ≤ T ≤ 1 0 4 1 \le T \le 10^4 1T104 3 ≤ n ≤ 1 0 9 3 \le n \le 10^9 3n109

【输入样例1】

4
3
4
12
1000000000

【输出样例1】

NO
YES
YES
YES

【原题链接】

https://www.acwing.com/problem/content/4867/


【题目分析】

签到题。

【周赛现场 AC 代码】✅

#include<bits/stdc++.h>

using namespace std;

int T, x;

int main() {
    cin >> T;
    while (T--) {
        cin >> x;
        if (x % 4 == 0)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}


【题目B】有效类型

【题目描述】

在本题中,关于有效类型字符串,具体定义如下:

  • int 是有效类型字符串。
  • 如果字符串 X 和字符串 Y 都是有效类型字符串,则 pair<X,Y> 是有效类型字符串。

现有一行若干个单词,每个单词要么是 pair,要么是 int,并且其中 int 的数量恰好为 n n n 个。

你可以在不改变单词顺序的前提下,在这一行中任意添加 <>, 符号。

你的任务是构造出一个有效类型字符串。

输出这个有效类型字符串。

注意:

  1. 有效类型字符串中 不含 空格或其它多余字符。
  2. 可以证明如果存在满足条件的有效类型字符串,那么它一定是唯一的。
  3. 如果不存在满足条件的有效类型字符串,输出 Error occurred 即可。

【输入】

第一行包含整数 n n n,表示给定单词中 int 的数量。

第二行包含若干个单词,每个单词要么是 pair,要么是 int

【输出】

输出满足条件的有效类型字符串,如果不存在,则输出 Error occurred

注意,有效类型字符串中 不含 空格或其它多余字符。

【数据范围】

6 6 6 个测试点满足: 1 ≤ n ≤ 5 1 \le n \le 5 1n5
所有测试点满足: 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105,输入的总单词数量不超过 1 0 5 10^5 105,输入的 int 数量恰好为 n n n

【输入样例1】

3
pair pair int int int

【输出样例1】

pair<pair<int,int>,int>

【输入样例2】

1
pair int

【输出样例2】

Error occurred

【原题链接】

https://www.acwing.com/problem/content/4868/


【题目分析】

递归构建 前序遍历的 pair 二叉树,代码十分精妙(详见代码注释)

这种递归的解题方式 值得反复咀嚼

详细讲解见y总视频:https://www.acwing.com/video/4637/

image-20230226202730027

【复盘后的优化代码】✅

//
// Created by Ricky X on 2023/2/24.
//

#include<bits/stdc++.h>

using namespace std;
int n;
string str, ans;

bool dfs() {
    // 当前有字符可以读入
    if (cin >> str && str != "") {
        // 当前读入字符串为pair,则需要构建左右子树
        if (str == "pair") {
            ans += "pair<";
            if (!dfs()) return false; // 无法构建左子树,返回false
            ans += ",";
            if (!dfs()) return false; // 无法构建右子树,返回false
            ans += ">";
            return true;
        } else if (str == "int") {  // 读入为int,直接返回true
            ans += "int";
            return true;
        }
    } else {  // 当前没有字符读入,无法构建,返回false
        return false;
    }
}

int main() {
    cin >> n;
    // dfs()的作用是读入一个字符串,并且将其作为根结点,判断能否建立一颗树
    // dfs()返回true,说明当前读入的字符串可以构建一颗树
    // dfs()返回false,说明当前读入的字符串不可以构建一棵树
    // 不可以构建的情况:1.字符串读完了;2.读入pair,但是无法构建左右子树

    // dfs()构建成功,但是还有字符串读入,就会有多棵树,舍去该情况
    // 当且仅当dfs()构建成功,且没有字符串读入时,才能输出答案
    // 答案存储到字符串ans中
    bool flag = dfs();
    if (flag && cin >> str) flag = false;

    // 输出结果
    if (!flag) cout << "Error occurred" << endl;
    else cout << ans << endl;

    return 0;
}

【周赛现场 AC 代码】

现场未 AC



【题目C】最大数量

【题目描述】

一个无向图有 n n n 个点,编号 1 ∼ n 1∼n 1n

这些点之间没有任何边。

给定 d d d 个需求,编号 1 ∼ d 1∼d 1d

其中,第 i i i 个需求是让点 x i x_i xi 和点 y i y_i yi 连通。

需求可能存在重复。

在本题中,你需要依次解决 d d d 个问题,编号 1 ∼ d 1∼d 1d

其中,第 i i i 个问题是,请你在图中添加恰好 i i i 条无向边(不能添加重边和自环),使得:

  1. i i i 个需求都得到满足。
  2. 所有点的度的最大值尽可能大。

对于每个问题,你不需要输出具体方案,你只需要输出度的最大可能值。

注意:

  1. 如果点 a a a 和点 b b b 之间存在路径,则称点 a a a 和点 b b b 连通。
  2. 图中与点 a a a 关联的边数,称为点 a a a 的度。
  3. d d d 个问题之间是相互独立的,每个问题的答案都必须独立计算。

【输入】

第一行包含两个整数 n , d n,d n,d

接下来 d d d 行,其中第 i i i 行包含两个整数 x i , y i x_i,y_i xi,yi,表示第 i i i 个需求是让点 x i x_i xi 和点 y i y_i yi 连通。

【输出】

d d d 行,其中第 i i i 行输出第 i i i 个问题中,度的最大可能值。

【数据范围】

前三个测试点满足, 2 ≤ n ≤ 10 2 \le n \le 10 2n10

所有测试点满足, 2 ≤ n ≤ 1000 2 \le n \le 1000 2n1000 1 ≤ d ≤ n − 1 1 \le d \le n−1 1dn1 1 ≤ x i , y i ≤ n 1 \le x_i,y_i \le n 1xi,yin x i ≠ y i x_i \ne y_i xi=yi

【输入样例1】

7 6
1 2
3 4
2 4
7 6
6 5
1 7

【输出样例1】

1
1
3
3
3
6

【输入样例2】

10 8
1 2
2 3
3 4
1 4
6 7
8 9
8 10
1 4

【输出样例2】

1
2
3
4
5
5
6
8

【原题链接】

https://www.acwing.com/problem/content/4869/


【题目分析】

并查集 + 贪心(菊花图)

具体讲解见y总视频:https://www.acwing.com/video/4638/

image-20230226093749980

【复盘后的优化代码】✅

//
// Created by Ricky X on 2023/2/24.
//

#include<bits/stdc++.h>

using namespace std;
const int N = 1010;
int pre[N], sum[N];
int n, d, a, b, op; // op是可以额外连接的操作次数

// 并查集初始化
void init() {
    for (int i = 1; i <= n; i++) pre[i] = i, sum[i] = 1;
}

// 查找元素x的祖先
int find(int x) {
    if (pre[x] != x) pre[x] = find(pre[x]);
    return pre[x];
}

// 合并两个集合
void join(int a, int b) {
    int x = find(a);
    int y = find(b);
    if (x != y) pre[x] = y, sum[y] += sum[x];
    else op++; // 额外连接操作数+1
}

// 查询
void solve() {
    // 将当前集合的大小存入vector
    vector<int> v;
    v.clear();
    for (int i = 1; i <= n; i++)
        if (pre[i] == i)
            v.push_back(sum[i]);
    sort(v.begin(), v.end(), greater<int>());

    // 通过op次操作,把前op个元素数量最大的集合合并
    int res = v[0]; // 第一个最大的集合是不用合并的
    for (int i = 1; i <= op; i++) {
        res += v[i];
    }
    cout << res - 1 << endl;
}

int main() {
    ios::sync_with_stdio(false);  //cin读入优化
    cin.tie(0);

    cin >> n >> d;
    init();
    for (int i = 1; i <= d; i++) {
        cin >> a >> b;
        join(a, b);
        solve();  // 求解当前问题i的答案
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Jmeter进行性能测试的这套步骤,入职京东后,涨薪2次,升职一次

项目背景&#xff1a; 我们的平台为全国某行业监控平台&#xff0c;经过3轮功能测试、接口测试后&#xff0c;98%的问题已经关闭&#xff0c;决定对省平台向全国平台上传数据的接口进行性能测试。 01 测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c;…

怎么设置启用远程桌面?如何让外网电脑远程本地内网?

如何远程控制电脑&#xff1f;最简单实用的方案是开启电脑系统自带的远程桌面功能&#xff0c;如果涉及跨网、内外网互通&#xff0c;可以同时用快解析内网映射外网。下面是方案的具体实施步骤&#xff0c;供大家参考。 怎么打开设置启用远程桌面&#xff1f; 1.在目标需要远…

IO:阻塞和非阻塞、同步和异步

阻塞和非阻塞 阻塞的时候线程会被挂起 阻塞&#xff1a; 当数据还没准备好时&#xff0c;调用了阻塞的方法&#xff0c;则线程会被挂起&#xff0c;会让出CPU时间片&#xff0c;此时是无法处理过来的请求&#xff0c;需要等待其他线程来进行唤醒&#xff0c;该线程才能进行后续…

Javascript的API基本内容(二)

一、事件监听 结合 DOM 使用事件时&#xff0c;需要为 DOM 对象添加事件监听&#xff0c;等待事件发生&#xff08;触发&#xff09;时&#xff0c;便立即调用一个函数。 addEventListener 是 DOM 对象专门用来添加事件监听的方法&#xff0c;它的两个参数分别为【事件类型】和…

产业链金融的前世今生

产业链金融脱胎于供应链金融&#xff0c;又不同于供应链金融。二者的区别是&#xff0c; 供应链金融服务于单个环节、单个企业&#xff0c;而产业链金融是以产业链的核心 企业为依托&#xff0c;针对产业链的各个环节&#xff0c;设计个性化、标准化的金融服务产品&#xff0c;…

Appium自动化测试框架是一种较为优雅的使用方式

以操作小米商城下单为例流程是 启动小米商城app, 点击分类&#xff0c;点击小米手机&#xff0c; 点击小米10 至尊版&#xff0c;点击加入购物车&#xff0c;点击确定....原脚本Copyfrom time import sleep from appium import webdriver from selenium.common.exceptions impo…

python有哪些应用方向及其学习方法 资源推荐

目录 python 语言的应用方向 python简介 1.常规软件开发 2.科学计算 3.自动化运维 4.云计算 5.WEB开发 6.网络爬虫 7.大数据分析 8.人工智能 9.python处理图片和视频 【渗透测试相关工具下载】 推荐阅读 python实战文章 渗透测试文章 渗透测试实战专栏 python黑…

Gorm-学习笔记

1 基本使用 2 创建数据 2.1 如何使用Upsert 使用clause.OnConflict处理数据冲突 2.2 如何使用默认值 通过使用default标签为字段定义默认值 3 查询数据 3.1 First与Find 使用First时&#xff0c;需要注意查询不到数据会返回ErrRecordNotFound。 使用Find查询多条数据&#x…

详讲函数.2.

目录 5. 函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 小结&#xff1a; 6. 函数的声明和定义 6.1 函数的声明&#xff1a; 6.2 函数的定义&#xff1a; 5. 函数的嵌套调用和链式访问 函数和函数之间可以根据实际的需求进行组合的&#xff0c;也就是互相调用的…

JUC包:CountDownLatch源码+实例讲解

1 缘起 有一次听到同事谈及AQS时&#xff0c;我有很多点懵&#xff0c; 只知道入队和出队&#xff0c;CLH&#xff08;Craig&#xff0c;Landin and Hagersten&#xff09;锁&#xff0c;并不了解AQS的应用&#xff0c; 同时结合之前遇到的多线程等待应用场景&#xff0c;发现…

QML 元素布局

定位器&#xff1a;是QtQuick模块中的提供的&#xff0c;有以下三种 Row 行定位器Column 列定位器Grid 网格定位器Flow 流动定位器常用属性: spacing间距 Row &#xff08;行定位器&#xff09; 按照行的方排列 //行定位器 Row{spacing: 5//设置间距Rectangle{width: 100he…

[蓝桥杯] 二分与前缀和习题练习

文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…

《操作系统》——第二章 进程与线程

目录 2.1.1进程的概念、组成、特征 2.1.2进程的状态与转换、进程的组织 2.1.3进程控制 2.1.4进程通信 2.1.5线程的概念 2.1.6线程的实现方式和多线程模型 2.2.1调度的概念、层次 2.2.2进程调度的时机、切换与过程、方式 2.2.4调度算法的评价指标 2.2.5调度算法(1) 2…

1249 亲戚(并查集)

1249. 亲戚 题目 提交记录 讨论 题解 视频讲解或许你并不知道&#xff0c;你的某个朋友是你的亲戚。 他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。 如果能得到完整的家谱&#xff0c;判断两个人是否是亲戚应该是可行的&#xff0c;但如果两个人的最近公共祖…

数据库之高级查询

注意&#xff1a;第一个包含空&#xff0c;第二句不包含空注意&#xff1a;第二句是错的&#xff0c;聚合函数不能出现在where中。注意&#xff1a;相当于&#xff0c;按照分组属性&#xff0c;求出每个组的聚合函数值&#xff0c;所以肯定不能放单个属性有冲突with rollup是最…

MyBatis - 05 - 封装SqlSessionUtil工具类(用于获取SqlSession对象)并测试功能

文章目录1.新建SqlSessionUtils工具类2.编写静态方法3.项目结构及代码项目结构数据库和表pom.xmlParameterMapper接口&#xff1a;User类&#xff1a;ParameterMapper.xmljdbc.propertieslog4j.xml:mybatis-config.xml:ParameterMapperTest测试类&#xff1a;测试结果1.新建Sql…

leetcode打卡-回溯I

77. 组合 leetcode题目链接&#xff1a;https://leetcode.cn/problems/combinations/ leetcode AC记录&#xff1a; 代码如下&#xff1a; public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res new ArrayList<>(16…

操作系统期末复习

操作系统概论 文章目录操作系统概论操作系统的目标&#xff1a;基本特征:主要功能发展操作系统的运行机制时钟管理中断机制&#xff1a;指令程序处理机状态原语&#xff1a;由若干指令组成的程序段&#xff0c;完成特定功能系统数据结构系统调用体系结构进程--资源分配和调度的…

[黑马程序员SSM框架教程] Spring-22 注解开发依赖注入

1.自动装配是基于暴力反射对私有属性进行装配的&#xff0c;所以不需要setter方法。打破了IOC提供对象&#xff0c;我提供入口的思想。现在不用提供入口也能实现。 2. Qualifier必须依赖注解Autowired&#xff0c;当自动装配的接口类型有多个实现类时使用&#xff0c; 3. Autow…

Linux基础命令-du查看文件的大小

文章目录 du 命令介绍 语法格式 基本参数 参考实例 1&#xff09;以人类可读形式显示指定的文件大小 2&#xff09;显示当前目录下所有文件大小 3&#xff09;只显示目录的大小 4&#xff09;显示根下哪个目录文件最大 5&#xff09;显示所有文件的大小 6&#xff0…