Codeforces Round #911 (Div. 2)

news2024/9/24 7:15:32

A.Cover in Water

题意:

有一个 1 × n 1 \times n 1×n的水池,里面有些格子可以加水,有些格子是被堵上的,你可以进行以下两种操作:

  • 1.往一个空的格子里加水

  • 2.移除一个有水的格子中的水,并将这些水添加到另一个格子中

且如果两个有水的格子中间都是空格子,那么水将覆盖中间所有的空格子。

问最少进行多少次操作1,才能使所有空格子中均有水。

分析:

不难发现,只要出现一段长度大于2的连续空格子,那么就可以在这段格子两端各使用一次操作1,然后这段格子中间就全部被水覆盖了,且无论怎么使用操作2,由于两端均有水,取完之后格子也不会变空,可以无限取,即一定只需要两次操作1.

如果没有任意一段连续的空格子长度大于2,那么只能对每个格子使用一次操作1,才能使所有格子都包含水,此时的操作1使用次数就是空格子的个数。

代码:

#include <bits/stdc++.h>
using namespace std;


void solve() {
    int n;
    string s;
    cin >> n >> s;
    int ans = 0, cnt = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == '.') {
            cnt++;
            if (cnt > 2) {
                cout << 2 << endl;
                return;
            }
        } else {
            ans += cnt;
            cnt = 0;
        }
    }
    ans += cnt;//不要忘了加上最后一段
    cout << ans << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

B.Laura and Operations

题意:

给出 a a a 1 1 1 b b b 2 2 2 c c c 3 3 3,每次可以选择 1 ∼ 3 1 \sim 3 13中的两个不同数字,消除这两个数字,并产生一个新的数字,这个产生的数字与消除的两个数字均不同,问有没有方法可以使最后只剩下 1 , 2 , 3 1, 2, 3 1,2,3中的一种(能否剩下 1 , 2 , 3 1, 2, 3 1,2,3的可能性单独输出)

分析:

首先,如果想要剩下的全部都是 1 1 1,那么就需要先将 2 2 2 3 3 3的数量变为相同的,再通过一直消除 2 2 2 3 3 3使得只剩下 1 1 1

那么要怎么让 2 2 2 3 3 3数量相同呢?

可以先消除 1 1 1和出现较多的数,不难发现,如果此时没有 1 1 1,是无法完成消除操作的,此时无解。

而每次消除 1 1 1和出现较多的数字,每次进行消除,可以使较大出现次数和较小出现次数之间的差减少2(不用担心1是否不够用,通过消除 2 2 2 3 3 3可以再获得 1 1 1),那么如果这两个数的出现次数差为奇数,是无法将这两个数完全消除的,此时也是无解。

结论:只要另外两个数的差为偶数,且满足以下两个要求之一,就可以完成消除操作:

  1. 想要留下的数字出现次数不为0

  2. 需要消除的两个数字出现次数已经相同

代码:

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int a, b, c;
    cin >> a >> b >> c;
    if (abs(b - c) % 2 == 0 && (min(c, b) != 0 || a != 0)) {
        cout << 1;
    } else {
        cout << 0;
    }
    if (abs(a - c) % 2 == 0 && (min(a, c) != 0 || b != 0)) {
        cout << ' ' << 1;
    } else {
        cout << ' ' << 0;
    }
    if (abs(a - b) % 2 == 0 && (min(a, b) != 0 || c != 0)) {
        cout << ' ' << 1;
    } else {
        cout << ' ' << 0;
    }
    cout << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

C.Anji’s Binary Tree

题意:

有一棵二叉树,树上每个节点均写着"ULR"中的一个字符,这三个字符的含义如下:

  • 'U':当你走到这个节点,你需要向这个节点的父节点移动

  • 'L':当你走到这个节点,你需要向这个节点的左孩子移动

  • 'R':当你走到这个节点,你需要向这个节点的右孩子移动

问:你最少需要修改多少次节点上的字符,能使你从根节点出法到达叶节点。

分析:

  • 当前节点为'U':想要向叶节点移动,遇到'U'就需要修改,此时不需要考虑节点被修改成了什么。

  • 当前节点为'L':此时往左子树走不需修改次数,往右子树走需一次修改次数,记录两者中的较小值

  • 当前节点为'R':此时往右子树走不需修改次数,往左子树走需一次修改次数,记录两者中的较小值

从根节点开始搜索,到达叶节点返回,记录最小的修改次数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f

int n, L[300005], R[300005];
string s;

int dfs(int x) {
    if (x == 0) return INF;//走到空节点了,返回极大值
    if (L[x] == 0 && R[x] == 0) return 0;//走到叶节点,返回0
    if (s[x - 1] == 'U') {
        return min(dfs(L[x]), dfs(R[x])) + 1;
    } else if (s[x - 1] == 'L') {
        return min(dfs(L[x]), dfs(R[x]) + 1);
    } else {
        return min(dfs(L[x]) + 1, dfs(R[x]));
    }
}

void solve() {
    cin >> n >> s;
    for (int i = 1; i <= n; i++) cin >> L[i] >> R[i];
    cout << dfs(1) << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

D.Small GCD

题意:

给出一个包含 n n n个元素的数组和一个函数 f ( a , b , c ) = g c d ( a , b ) f(a, b, c) = gcd(a, b) f(a,b,c)=gcd(a,b),其中 a < b < c a < b < c a<b<c

求: ∑ i = 1 n ∑ j = i + 1 n ∑ k = j + 1 n f ( a i , a j , a k ) \sum\limits_{i = 1}^{n}\sum\limits_{j = i + 1}^{n}\sum\limits_{k = j + 1}^{n}f(a_i, a_j, a_k) i=1nj=i+1nk=j+1nf(ai,aj,ak)

分析:

由于每轮取得三个数实际上只有两个较小数字会对答案产生影响,因此可以先对输入的元素进行排序。

然后使用两层for循环对 a i , a j a_i,a_j ai,aj进行枚举,此时的 g c d ( a i , a j ) gcd(a_i, a_j) gcd(ai,aj)的答案对于任意一个 k k k都是成立的,即 a i , a j a_i,a_j ai,aj对答案产生的贡献为 g c d ( a i , a j ) × ( n − j ) gcd(a_i, a_j) \times (n - j) gcd(ai,aj)×(nj)

但是,此时的时间复杂度为 O ( n 2 ) O(n^2) O(n2),是无法通过本题的,因此,需要对算法进行优化

优化

先考虑所有因数对答案的贡献,那么只需一层for循环,遍历到 a j a_j aj时,如果 a j a_j aj的因数 b b b在前面出现过,那么这个因数对答案的贡献就是在前面出现的次数(包含该因数的 a i a_i ai个数)乘上后面的数字个数,即: c n t [ b ] × ( n − i ) cnt[b] \times (n - i) cnt[b]×(ni)

而对于因数分解的时间复杂度是比较慢的,需要先对 1 0 5 10^5 105以内的数预处理所有因子。

求完所有因子产生的贡献后,需要考虑实际上求出的贡献计算了很多重复的情况,如因子为 2 2 2的贡献中包含了所有 2 2 2的倍数的贡献。需要将这些重复计算的贡献减去。

此时可以从后往前对因子进行遍历,每次先将所有由倍数产生的贡献减去,然后计算当前因子产生的贡献,即当前因子的出现次数乘上因子的值。

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;

const int N = 1e5 + 5e2;

int n, a[N];
ll sum[N], cnt[N];

vector<int> fact[N];

void init() {
    for (int i = 1; i < N; i++) {
        for (int j = i; j < N; j += i) {
            fact[j].push_back(i);//预处理因子
        }
    }
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++) {
        int len = fact[a[i]].size();
        for (int j = 0; j < len; j++) {
            sum[fact[a[i]][j]] += cnt[fact[a[i]][j]] * (n - i);
            cnt[fact[a[i]][j]]++;
        }
    }
    ll ans = 0;
    for (int i = a[n]; i >= 1; i--) {
        for (int j = i + i; j < N; j += i) {
            sum[i] -= sum[j];
        }
        ans += sum[i] * i;
    }
    cout << ans << endl;
}

int main() {
    init();
    int Case;
    cin >> Case;
    while (Case--) {
    //初始化
        memset(sum, 0, sizeof (sum));
        memset(cnt, 0, sizeof (cnt));
        solve();
    }
    return 0;
}

E.Transitive Graph

更新中…

以下学习交流QQ群,群号: 546235402,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

智能优化算法应用:基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混合蛙跳算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混合蛙跳算法4.实验参数设定5.算法结果6.参考…

Selenium+Python做web端自动化测试框架与实例详解教程

最近受到万点暴击&#xff0c;由于公司业务出现问题&#xff0c;工作任务没那么繁重&#xff0c;有时间摸索seleniumpython自动化测试&#xff0c;结合网上查到的资料自己编写出适合web自动化测试的框架&#xff0c;由于本人也是刚刚开始学习python&#xff0c;这套自动化框架目…

Roll-A-Ball 游戏

Roll-A-Ball 游戏 1&#xff09;学习资料 b站视频教程&#xff1a;https://www.bilibili.com/video/BV18W411671S/文档&#xff1a; * Roll-A-Ball 教程&#xff08;一)&#xff0c; * Roll-A-Ball 教程&#xff08;二)线上体验roll-a-ball成品 * http://www-personal.umich.e…

从裸机启动开始运行一个C++程序(十五)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十四&#xff09; 从裸机启动开始运行一个C程序&#xff08;十三&#xff09; 从裸机启动开始运行一个C程序&#xff08;十二&#xff09; 从裸机启动开始运行一个C程序&#xff08;十一&#xff09; 从裸机启…

金字塔原理 读书笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言第1篇 表达的逻辑第1章 为什么要用金字塔结构归类分组&#xff0c;将思想组织成金字塔自上而下表达&#xff0c;结论先行自下而上思考&#xff0c;总结概括 第2…

物理机虚拟化关键技术介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、虚拟化原理 将多个“同质或异构”资源&#xff08;包括但不限于芯片、硬件、软件、应用&#xff09;形成一个资源池&#xff0c;对资源池进行抽象、解耦形成独立的“虚拟资源”&#xff0c;并实现虚拟资…

【链接MySQL】教你用VBA链接MySQL数据库

hi&#xff0c;大家好呀&#xff01; 之前呢&#xff0c;给大家分享过一个自制链接表管理器的文章&#xff0c;文章中有链接SQL Server数据库的代码&#xff0c;大家对这一段代码比较有兴趣&#xff0c;既然大家有兴趣&#xff0c;那我们今天就来讲一下链接数据库的代码。 这…

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(9)

注解目录 1、znFAT 的起源 1.1 源于论坛 &#xff08;那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。&#xff09; 1.2 硬盘 MP3 推了我一把 &#xff08;“坤哥”的硬盘 MP3 播放器&#xff0c;让我深陷 FAT 文件系统不能自拔。&#xff09; 1.3 我…

Solidworks模型上色技巧以及增加快捷键快速打开和关闭“阴影效果和楼板反射”

Solidworks模型上色技巧 Chapter1 给Solidworks模型上色技巧设置外观的方法具体操作删除颜色的技巧这样操作&#xff1a; Chapter2 SOLIDWORKS小技巧 | SolidWorks装配体零件快速上色自动设置Chapter3 solidworks装配图如何去掉阴影&#xff1f;Solidworks2022中的阴影效果怎么…

5.24每日一题(判断原函数是否为周期函数的基本定理 )

原函数为周期函数的充要条件&#xff1a;f(x)在某区间上的积分为0

高中生分科考试--座位编排系统

这个系统是帮我一同学的哥哥的做的座位编排系统&#xff0c;他是某个学校的教育从事者 基本需求&#xff1a;就是能够根据他提供的各个分科班级同学的成绩单来选择相同分科的考场编排&#xff08;按成绩高低&#xff09;&#xff0c;同时输入相应的考场数&#xff0c;和每个考…

【算法萌新闯力扣】:旋转链表

力扣题目&#xff1a;旋转链表 开篇 今天是备战蓝桥杯的第25天和算法村开营第3天&#xff01;经过这3天的学习&#xff0c;感觉自己对链表的掌握程度大大地提升&#xff0c;尤其是在帮村里的同学讨论相关问题时。本篇文章&#xff0c;给大家带来一道旋转链表的题目&#xff0c…

【VROC】看Intel VROC如何给NVMe SSD做RAID

在当今对硬盘性能要求越来越高的环境中&#xff0c;SATA和SAS接口由于自身的限制&#xff0c;其性能很难突破600MiB/s的瓶颈。因此&#xff0c;对于需要更高底层硬件性能的行业&#xff0c;如数据库等&#xff0c;对NVMe盘的需求越来越迫切。然而&#xff0c;NVMe盘直通到CPU&a…

2005-2022年全球各国经济距离数据

2005-2022年全球各国经济制度距离数据 1、时间&#xff1a;2005-2022年 2、指标&#xff1a;国家、年份、经济距离1&#xff08;根据美国传统基金会世界经济自由度指数整理&#xff09;、经济距离2&#xff08;参考(Kogut&Singh,1988)构建经济制度距离&#xff09; 3、范…

dst-admin饥荒管理后台 RCE漏洞复现(CVE-2023-0646、CVE-2023-0647、CVE-2023-0649)

0x01 产品简介 dst-admin饥荒管理后台是qinming99个人开发者的一个用 Java 语言编写的 web 程序。 0x02 漏洞概述 dst-admin饥荒管理后台kickPlayer、cavesConsole、sendBroadcast等接口处配置不当&#xff0c;导致破解口令后的攻击者可以进行命令注入&#xff0c;获取服务器权…

第五节HarmonyOS ArkTS声明式开发范式

ArkTS声明式开发范式&#xff1a; 规范中各个内容说明如下&#xff1a; 装饰器 1、基本UI装饰器Entry、Component Entry 装饰struct&#xff0c;页面的入口。 Component 装饰struct&#xff0c;表示该struct具有基于组件的能力。 2、数据装饰器State、Prop、Link State…

【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验)

目录 前言阅读对象笔记正文一、ShardingSphere介绍1.1 ShardingSphere-JDBC&#xff1a;代码级别1.2 ShardingSphere-Proxy&#xff1a;应用级别1.3 横向对比图 二、ShardingSphere之——数据分片2.1 基本介绍2.2 分片的形式2.2.1 垂直分片2.2.2 水平分片 2.3 数据分片核心概念…

Python实现性能自动化测试

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试 使用程序代替手工提升测试效率性能自动化 使用代码模拟大批量用户让用户并发请求多页面多用户并发请求采集参数&#xff0c;统计系统负载能力生成报告 2.Python中的性能自动…

代码随想录算法训练营 ---第四十九天

前言&#xff1a; 今天是买卖股票的最佳时机系列&#xff0c;本系列之前在学习贪心思想时做过一些。 第一题&#xff1a; 简介&#xff1a; 本题在读题时我们要注意到几个细节 1.本题股票买卖只有一次。2.我们要在最低点买股票&#xff0c;在最高点卖股票。 我的思路&#…

基于Java SSM框架+Vue实现药品保健品购物网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现药品保健品购物网站演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 ssm药源购物网站&#xff0c;主要的模块包括两个用户&#xff0c;管理员权限&#xff1a;用…