Codeforces Round #911 (Div. 2) A~E

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(树形DP)

题意:

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

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

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

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

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

分析:

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

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

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

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

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3fint 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;//走到叶节点,返回0if (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(图论)

题意:

给定一个有向图,点有点权,重复进行如下操作:如果存在边 a − > b a->b a>b b − > c b->c b>c但不存在 a − > c a->c a>c边 ,则添加边 a − > c a->c a>c。直到不存在这样的 ( a , b , c ) (a,b,c) (a,b,c)。做完操作后,询问点权之和最小且经过点数最多的简单路径的长度以及点权之和。

分析:

可以用强连通分离缩点,可以发现每个强连通分量在传递闭包中是一个完全图,因为我们需要的是最长路,所以只要走到这个强连通分量就必须走完分量中的所有点。
我们先用 t a r j a n tarjan tarjan进行缩点,原图中的简单路径就是缩点后的 D A G DAG DAG的路径,在 D A G DAG DAG上跑双关键字的 d p dp dp即可。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int ver[maxn], next1[maxn], head[maxn], dfn[maxn], low[maxn];
int stack1[maxn], vis[maxn], c[maxn];
vector<int> scc[maxn]; // 强连通分量
ll tot, top, num, cnt;
ll a[maxn];
vector<int> g[maxn];
ll sum[maxn];
ll dis[maxn];
struct node {int sum, num;
} aa[maxn];void add(int x, int y) {ver[++tot] = y;next1[tot] = head[x];head[x] = tot;
}int n, m;
ll dp[maxn];void init() {num = 0;top = 0;for (int i = 0; i <= cnt; i++)scc[i].clear();cnt = tot = 0;for (int i = 1; i <= n; i++) {sum[i] = 0;dis[i] = 0;dp[i] = 0;head[i] = 0;g[i].clear();dfn[i] = low[i] = stack1[i] = vis[i] = c[i] = 0;}
}void tarjan(int x) {num++;dfn[x] = low[x] = num;top++;stack1[top] = x;vis[x] = 1;for (int i = head[x]; i; i = next1[i]) {int y = ver[i];if (!dfn[y]) {tarjan(y);low[x] = min(low[x], low[y]);} else if (vis[y]) {low[x] = min(low[x], dfn[y]);}}if (dfn[x] == low[x]) {cnt++;int tmp;do {tmp = stack1[top--];vis[tmp] = 0;c[tmp] = cnt; // 每个点所属于的强连通分量编号scc[cnt].push_back(tmp);sum[cnt] += a[tmp];} while (x != tmp);}
}int main() {int t;cin >> t;while (t--) {cin >> n >> m;init();for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = 1; i <= m; i++) {int x, y;cin >> x >> y;add(x, y);}for (int i = 1; i <= n; i++) {if (!dfn[i])tarjan(i);}// cnt就是强连通块数量for (int x = 1; x <= n; ++x) {for (int i = head[x]; i; i = next1[i]) {int y = ver[i];if (c[x] != c[y]) {g[c[x]].push_back(c[y]);}}}for (int i = 1; i <= cnt; i++) {aa[i].sum = sum[i];aa[i].num = scc[i].size();}for (int i = 1; i <= cnt; i++) {// 遍历出边if (g[i].empty()) {dis[i] = scc[i].size();dp[i] = sum[i];} elsefor (auto u: g[i]) {if (dis[u] + scc[i].size() > dis[i]) {dis[i] = dis[u] + scc[i].size();dp[i] = dp[u] + sum[i];} else if (dis[u] + scc[i].size() == dis[i]) {dp[i] = min(dp[i], dp[u] + sum[i]);}}}ll mlen = 0;for (int i = 1; i <= cnt; i++)mlen = max(mlen, dis[i]);ll ans = 1e18;for (int i = 1; i <= cnt; i++)if (dis[i] == mlen)ans = min(ans, dp[i]);cout << mlen << " " << ans << endl;}return 0;
}

学习交流

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMq使用与整合

MQ基本概念 MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0c;存…

【3D程序软件】SideFX与上海道宁一直为设计师提供程序化 3D动画和视觉效果工具,旨在创造高质量的电影效果

Houdini是一个 从头开始构建的程序系统 使艺术家能够自由工作 创建多次迭代 并与同事快速共享工作流程 Houdini FX为 视觉特效艺术家创作故事片 广告或视频游戏 凭借其基于程序节点的工作流程 Houdini FX可让 您更快地创建更多内容 从而缩短时间并 在所有创意任务中…

SpringBoot——自定义start

优质博文&#xff1a;IT-BLOG-CN 一、Mybatis 实现 start 的原理 首先在写一个自定义的start之前&#xff0c;我们先参考下Mybatis是如何整合SpringBoot&#xff1a;mybatis-spring-boot-autoconfigure依赖包&#xff1a; <dependency><groupId>org.mybatis.spr…

中国移动联合中国华电完成基于ZETA物联网技术的风电机组主辅智能控制系统试点应用

2023年11月17日&#xff0c;中国移动联合中国华电研发的“基于ZETA物联网技术的风电机组主辅智能控制系统与风电机组叶片巡检系统”在甘肃省酒泉华电黑崖子风电场成功投运。中移物联网有限公司相关人员主导参与了本次试点。 ZETA技术是一种基于UNB的低功耗广域网&#xff08;LP…

JVM的小知识总结

加载时jvm做了这三件事&#xff1a; 1&#xff09;通过一个类的全限定名来获取该类的二进制字节流 什么是全限定类名&#xff1f; 就是类名全称&#xff0c;带包路径的用点隔开&#xff0c;例如: java.lang.String。 即全限定名 包名类型 非限定类名也叫短名&#xff0c;就…

近期知识点随笔

菜单查询&#xff08;编写权限时的细节&#xff09; 菜单查询list为了侧边框展示更完整&#xff08;不报空指针&#xff09; 登录时&#xff08;用户名&#xff09;查询出多个结果&#xff08;保证用户名唯一&#xff09; 文件上传 前端 对权限与菜单绑定的修改&#xff08;实…

【数据结构】树的概念以及二叉树

目录 1 树概念及结构 1.1 树的概念 1.3 树的存储 2 二叉树的概念及结构 2.1 概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 1 树概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组…

04 # 第一个 TypeScript 程序

初始化项目以及安装依赖 新建 ts_in_action 文件夾 npm init -y安装好 typescript&#xff0c;就可以执行下面命令查看帮助信息 npm i typescript -g tsc -h创建配置文件&#xff0c;执行下面命令就会生成一个 tsconfig.json 文件 tsc --init使用 tsc 编译一个 js 文件 新…

解决:AttributeError: ‘NoneType’ object has no attribute ‘shape’

解决&#xff1a;AttributeError: ‘NoneType’ object has no attribute ‘shape’ 文章目录 解决&#xff1a;AttributeError: NoneType object has no attribute shape背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&…

Vue3集成ThreeJS实现3D效果,threejs+Vite+Vue3+TypeScript 实战课程【一篇文章精通系列】

Vue3集成ThreeJS实现3D效果&#xff0c;threejsViteVue3TypeScript 实战课程【一篇文章精通系列】 项目简介一、项目初始化1、添加一些依赖项 二、创建3D【基础搭建】1、绘制板子&#xff0c;立方体&#xff0c;球体2、材质和光照3、材质和光照和动画4、性能监控5、交互控制6、…

pathlib --- 面向对象的文件系统路径

目录 基础使用 纯路径 通用性质 运算符 访问个别部分 方法和特征属性 具体路径 方法 对应的 os 模块的工具 3.4 新版功能. 源代码 Lib/pathlib.py 该模块提供表示文件系统路径的类&#xff0c;其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 …

在Spring Boot中隔离@Async异步任务的线程池

在异步任务执行的时候&#xff0c;我们知道其背后都有一个线程池来执行任务&#xff0c;但是为了控制异步任务的并发不影响到应用的正常运作&#xff0c;我们需要对线程池做好相关的配置&#xff0c;以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…

FIORI /N/UI2/FLP 始终在IE浏览器中打开 无法在缺省浏览器中打开

在使用/N/UI2/FLP 打开fiori 启动面板的时候&#xff0c;总是会在IE浏览器中打开&#xff0c;无法在缺省浏览器打开 并且URL中包含myssocntl 无法正常打开 启动面板 这种情况可以取消激活ICF节点/sap/public/myssocntl

SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

1.问题描述&#xff1a; 使用springboot开发一个项目&#xff0c;开发文件上传的时候&#xff0c;通常会将上传的文件存储到资源目录下的static里面&#xff0c;然后在本地测试上传文件功能没有问题&#xff0c;但是将项目打成jar包放到服务器上运行的时候就会报错&#xff0c…

IDC MarketScape2023年分布式数据库报告:OceanBase位列“领导者”类别,产品能力突出

12 月 1 日&#xff0c;全球领先的IT市场研究和咨询公司 IDC 发布《IDC MarketScape:中国分布式关系型数据库2023年厂商评估》&#xff08;Document number:# CHC50734323&#xff09;。报告认为&#xff0c;头部厂商的优势正在扩大&#xff0c;OceanBase 位列“领导者”类别。…

STM32 定时器TIM

单片机学习 目录 文章目录 前言 一、TIM简介 二、STM32的三种定时器 2.1基本定时器 2.1.1定时中断功能 1. 时钟源 2. 预分频器 3. 计数器 4. 自动重装寄存器 5.更新中断和更新事件 2.1.2主模式触发DAC功能 2.2 计数模式 2.2通用定时器 2.2.1 时钟源 外部时钟模式2 外部时钟模式…

Java中的异常你了解多少?

目录 一.认识异常二.异常分类三.异常的分类1.编译时异常2.运行时异常 四.异常的处理1.LYBL&#xff1a;事前防御型2.EAFP&#xff1a;事后认错型 五.异常的抛出Throw注意事项 六.异常的捕获1.异常的捕获2.异常声明throws3.try-catch捕获并处理 七.自定义异常 一.认识异常 在Jav…

一文带你了解网络安全简史

网络安全简史 1. 上古时代1.1 计算机病毒的理论原型1.2 早期计算机病毒1.3 主要特点 2. 黑客时代2.1 计算机病毒的大流行2.2 知名计算机病毒2.3 主要特点 3. 黑产时代3.1 网络威胁持续升级3.2 代表性事件3.3 主要特点 4 高级威胁时代4.1 高级威胁时代到来4.2 著名的APT组织4.3 …

基于A*的网格地图最短路径问题求解

基于A*的网格地图最短路径问题求解 一、A*算法介绍、原理及步骤二、Dijkstra算法和A*的区别三、A*算法应用场景四、启发函数五、距离六、基于A*的网格地图最短路径问题求解实例分析完整代码 七、A*算法的改进思路 一、A*算法介绍、原理及步骤 A*搜索算法&#xff08;A star al…

Echarts大屏可视化_03 定制柱状图

柱状图模块引入 1.找到合适的图表 在echarts中寻找与目标样式相近的图表 Examples - Apache ECharts 2. 引入柱状图 使用立即执行函数构建&#xff0c;防止变量全局污染 实例化对象 将官网中提供的option复制到代码中&#xff0c;并且构建图表 // 柱状图模块1 (function () {/…