Educational Codeforces Round 159 (Div. 2) A~E

A.Binary lmbalance(思维)

题意:

给出一个01字符串,你可以对字符串进行无限次下列操作:

  • 选择一个位置 i ( 1 ≤ i ≤ ∣ s ∣ − 1 , |s|为字符串s的长度 ) i(1 \le i \le |s| - 1,\text{|s|为字符串s的长度}) i(1is1,|s|为字符串s的长度)

    • 如果 s [ i ] ≠ s [ i + 1 ] s[i] \ne s[i + 1] s[i]=s[i+1],在 s [ i ] s[i] s[i] s [ i + 1 ] s[i + 1] s[i+1]之间插入一个'0'

    • 如果 s [ i ] = s [ i + 1 ] s[i] = s[i + 1] s[i]=s[i+1],在 s [ i ] s[i] s[i] s [ i + 1 ] s[i + 1] s[i+1]之间插入一个'1'

问:能否在经过一些操作后,使得字符串中0的数量严格大于1的数量。

分析:

只要字符串中同时存在01,那么就可以无限产生0,此时必然成立,如果字符串中没有1,那么也必然成立。

只会当字符串中只有1时,才无法使0的数量严格大于1的数量。

代码:

#include <bits/stdc++.h>typedef long long LL;
using namespace std;
const int N = 3e5 + 5;void solve() {int n;string s;cin >> n >> s;int one = 0, zero = 0;for (int i = 0; i < n; i++) {if (s[i] == '0') zero++;else one++;}if (one && !zero) {//只有1出现,0没有出现才是NOcout << "NO" << endl;} else {cout << "YES" << endl;}
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

B.Getting Points(数学)

题意:

n n n天时间可以学习(第一天为周一),每天可以去上课,上课将获得 l l l点学分,每周一会布置一个课后练习,完成练习可以获得 t t t点学分。

每天可以选择休息或去上课,如果选择休息,那么无法得到当天的学习学分,且不能完成课后练习。如果选择去上课,可以获得上课的学分,且每天去上课可以在未完成的练习中选择不超过两个练习任务完成。

问:需要获得 P P P点学分才能毕业,最多可以休息多少天。

分析:

分两种情况进行考虑:

  • 1.如果每次去上课均完成两个任务,且这样就能获取足够的学分,那么就计算最少需要去上课几天。

  • 2.如果仅用最少上课天数去完成任务无法达到毕业学分,那么就需要额外的时间去上课,计算所需的额外天数。

题意:

#include <bits/stdc++.h>typedef long long LL;
using namespace std;
const int N = 3e5 + 5;void solve() {LL n, l, t, P;cin >> n >> P >> l >> t;LL task_cnt = n / 7 + (n % 7 != 0);//计算练习任务的数量LL lesson_cnt = (task_cnt + 1) / 2;//计算完成练习任务所需的天数LL earn = task_cnt * t + lesson_cnt * l;//每次去上课都可以获得上课的学分以及任务的学分if (earn >= P) {//此时已经拿够学分了LL one_earn =  t * 2 + l;//计算一天可以获得的学分LL ans = P / one_earn;//计算所需的天数if (ans * one_earn < P) {ans++;}cout << n - ans << endl;} else {P -= earn;//计算还需要获得的学分LL ans = lesson_cnt + P / l + (P % l != 0);//此时每天只能获得上课的学分,计算额外的天数cout << n - ans << endl;}
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

C.Insert and Equalize(GCD)

题意:

给出一个包含 n n n个数字的数组 a a a,其中每个数字均不相同。

你需要在数组 a a a中插入一个数组 a a a中没有的数字,然后选择一个 x x x,对数组中每个数通过加上若干次 x x x后,使得所有数字均相同。

问:最少需要多少次操作,才能使得数组中所有数字均相同?

分析:

a a a数组进行排序(此时数据存储于下标 1 ∼ n 1 \sim n 1n

a [ n ] a[n] a[n]为操作完最终的数,为了使所有数字均能通过加上 x x x变为 a [ n ] a[n] a[n],且操作次数最少,那么需要对 a a a数组所有数变为 a [ n ] a[n] a[n]所需加上的值取GCD(最大公约数)。

然后考虑插入的新数字怎么选择,考虑如果选择最大的数字加上 x x x的值做为新的数字,那么此时的操作次数需要加上 n n n(原数组中 n n n个数字还需再加上)。

而如果能选择一个满足 a [ n ] − k × x ( k < n ) a[n] - k \times x(k \lt n) a[n]k×x(k<n)的一个数字,那么只需要额外 k k k次操作就能使新插入的数字也变为 a [ n ] a[n] a[n],此时操作次数一定小于前面的方案,此时的 k k k可以通过for循环进行枚举获得。

代码:

#include <bits/stdc++.h>typedef long long LL;
using namespace std;
const int N = 3e5 + 5;int n;
LL a[N];void solve() {cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}sort (a + 1, a + n + 1);LL x = a[n] - a[1];for (int i = 2; i <= n; i++) {x = __gcd(x, a[n] - a[i]);}x = max(1ll, x);//考虑n为1时的情况LL cnt = 0;for (int i = 1; i <= n; i++) {cnt += (a[n] + x - a[i]) / x;}LL ans = cnt;for (int i = n - 1, k = 1; i >= 1; i--, k++) {if (a[i] != a[n] - k * x) {//找最小的kans = min(ans, cnt - n + k);break;}}cout << ans << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

D. Robot Queries(思维+STL)

题意:

有一个无限的二维网格。一开始,机器人站在 ( 0 , 0 ) (0,0) (0,0)点。机器人可以执行四条指令:
U , D , L , R U,D,L,R U,D,L,R分别表示向上下左右走一步。现在给你一个由 U D L R UDLR UDLR构成的操作序列 s s s,以及 q q q次查询,每次查询给出 x , y , l , r x,y,l,r x,y,l,r,表示将 s [ l ] − s [ r ] s[l]-s[r] s[l]s[r]这段操作序列翻转。
询问机器人在执行命令序列 s s s时是否访问了点 ( x , y ) (x,y) (x,y)

分析:

序列不翻转的情况下,走到每一个字母对应的位置一定是固定的,这样的情况查询每个点有没有被经过只要记录一下即可,如果进行了区间翻转, 1 1 1 l − 1 l-1 l1 以及 r r r n n n 的位置仍然是不变的,只有 l l l r r r 之间进行了中心翻转,通过画图可以发现如果 ( x , y ) (x,y) (x,y)翻转之后的坐标为 ( s x [ l − 1 ] + s x [ r ] − x , s y [ l − 1 ] + s y [ r ] − y ) (sx[l-1]+sx[r]-x,sy[l-1]+sy[r]-y) (sx[l1]+sx[r]x,sy[l1]+sy[r]y),只要查询这个点所记录的所有达到这个点的位置是否在 ( l , r ) (l,r) (l,r)之间即可

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
int sx[200005], sy[200005];int main() {int n, q;cin >> n >> q;string s;cin >> s;map<pair<int, int>, vector<int>> mp;int x = 0, y = 0;sx[0] = 0, sy[0] = 0;mp[{x, y}].push_back(0);for (int i = 0; i < n; i++) {if (s[i] == 'U') {y++;}if (s[i] == 'D') {y--;}if (s[i] == 'R') {x++;}if (s[i] == 'L') {x--;}mp[{x, y}].push_back(i + 1);sx[i + 1] = x, sy[i + 1] = y;}while (q--) {int x, y, l, r;cin >> x >> y >> l >> r;int ok = 0;if (mp[{x, y}].size() >= 1) {if (mp[{x, y}][0] < l || mp[{x, y}][mp[{x, y}].size() - 1] >= r) {ok = 1;cout << "YES" << endl;continue;}}int xx = sx[l - 1] + sx[r] - x;int yy = sy[l - 1] + sy[r] - y;if (mp[{xx, yy}].size() >= 1) {auto k = lower_bound(mp[{xx, yy}].begin(), mp[{xx, yy}].end(), l);if (k != mp[{xx, yy}].end() && *k < r)ok = 1;}if (ok == 1) {cout << "YES" << endl;} elsecout << "NO" << endl;}return 0;
}

E. Collapsing Strings (字典树)

题意:

n n n个字符串 s [ i ] s[i] s[i] ∣ s [ i ] ∣ \vert s[i]\vert s[i]表示 s [ i ] s[i] s[i]的长度,两个字符串的合并 C ( a , b ) C(a,b) C(a,b)的运算如下:

  • 如果 a a a为空,则 C ( a , b ) = b C(a,b)=b C(a,b)=b
  • 如果 b b b为空,则 C ( a , b ) = a C(a,b)=a C(a,b)=a
  • 如果 a a a的最后一个字母等于 b b b 的第一个字母,则 C ( a , b ) = C ( a 1 , ∣ a ∣ − 1 , b 2 , ∣ b ∣ ) C(a,b)=C(a_1,|a|-1,b_2,|b|) C(a,b)=C(a1,a1,b2,b) ,其中 s l , r s_{l,r} sl,r s s s l l l 字母到 r r r 字母的子串;
  • 否则为 C ( a , b ) = a + b C(a,b)=a+b C(a,b)=a+b,即两个字符串的连接。

询问 ∑ i = 1 n ∑ j = 1 n ∣ C ( s i , s j ) ∣ \sum_{i=1}^{n}\sum_{j=1}^{n} \vert C(s_i,s_j) \vert i=1nj=1nC(si,sj)

分析:

每一个字符串都要和其他包括自己的所有字符进行 C C C操作,对于任何一个固定的字符串 s s s,它要和所有的字符串进行拼接,也就是要减去最长相等前后缀的贡献。用字典树存所有的前缀的个数。枚举所有字符串后缀从长往短搜,每次先加上当前字符串总长,再考虑容斥从答案中减去重复的答案。
记录前一个后缀匹配前缀的个数 l s t lst lst,当前后缀匹配前缀的个数 c u r cur cur,以当前后缀作为匹配后缀减去的个数为 c u r − l s t cur-lst curlst,答案减去这一部分即可。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int ch[N][26], cnt[N], idx;void insert(string s) {int p = 0;for (int i = 0; i < s.size(); i++) {int j = s[i] - 'a'; // 字母映射if (!ch[p][j])ch[p][j] = ++idx;p = ch[p][j];cnt[p]++;}
}vector<int> query(string s) {vector<int> v(s.size(), 0);int p = 0;for (int i = 0; i < s.size(); i++) {int j = s[i] - 'a';if (!ch[p][j])break;p = ch[p][j];v[i] = cnt[p];}return v;
}int main() {int n;cin >> n;vector<string> s(n);int tot = 0;for (int i = 0; i < n; i++) {cin >> s[i];insert(s[i]);tot += s[i].size();}LL ans = 0;for (int i = 0; i < n; i++) {reverse(s[i].begin(), s[i].end());int len = s[i].size();ans += tot + 1LL * len * n;int lst = 0;auto v = query(s[i]);for (int j = s[i].size() - 1; j >= 0; j--) {int cur = v[j];int ad = cur - lst;lst = cur;ans -= 2 * (j + 1) * ad;}}cout << ans << endl;return 0;
}

学习交流

以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图

大家好,我是微学AI,今天给大家介绍一下深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图。本文我将介绍自动驾驶技术及其应用场景,并重点阐述了基于计算机视觉技术下的自动驾驶。自动驾驶技术是一种利用人工智能和…

LeetCode刷题--- 计算布尔二叉树的值

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

cache教程1.LRU 缓存淘汰策略

这一节实现LRU算法&#xff0c;要理解明白其使用的数据结构。 FIFO/LFU/LRU 算法简介 Cache的缓存全部存储在内存中&#xff0c;内存是有限的&#xff0c;因此不可能无限制地添加数据。当占用内存超过了给定的内存大小时候&#xff0c;就需要从缓存中移除一条或多条数据了。我…

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3&#xff0c;包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识&#xff0c;为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

rename--一些例子与问题

指令 A 和指令 B之间存在先写后读(RAW)的相关性 指令 B 的源寄存器 r0 来自于指令 A 产生的结果因此在进行寄存器重命名的时候&#xff0c;指令 B 的 r0 对应的物理寄存器应该直接来自于指令A所对应的P30,而不应该来自于从RAT读取的值。指令A,B,D之间存在先写后写(WAW)的相关性…

阿里云效部署前后端

静态站点到OSS 阿里云-云效&#xff0c;阿里云企业级一站式 DevOps&#xff0c;可以免费使用&#xff08;会限制人数、流水线数量等&#xff0c;个人项目够用了&#xff09;。相关文章 CI 持续集成 - 阿里云云效 OSS 是对象存储的意思&#xff0c;一般一个项目对应一个 Bucke…

20231202年江西省“振兴杯”网络信息行业(信息安全测试员)职业技能竞赛

C1-xor chall.py from flag import flagdef encrypt(x, y):keyzxbresultfor i in range(len(x)):resultchr(ord(x[i])^ord(y[i])^ord(key[i%3]))return result x flag y flag[1:] flag[0]enc open(flag.enc, wb) enc.write(encrypt(x, y)) enc.close()简单的异或&#xf…

Java API接口强势对接:构建高效稳定的系统集成方案

文章目录 1. Java API接口简介2. Java API接口的优势2.1 高度可移植性2.2 强大的网络通信能力2.3 多样化的数据处理能力 3. 实战&#xff1a;Java API接口强势对接示例3.1 场景描述3.2 用户管理系统3.3 订单处理系统3.4 系统集成 4. 拓展&#xff1a;Java API接口在微服务架构中…

LeetCode:1466. 重新规划路线(DFS C++、Java)

目录 1466. 重新规划路线 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 1466. 重新规划路线 题目描述&#xff1a; n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有…

智能优化算法应用:基于变色龙算法无线传感器网络(WSN)覆盖优化 - 附代码

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

Revisiting Proposal-based Object Detection阅读笔记

Revisiting Proposal-based Object Detection阅读笔记 论文地址&#xff1a;link Abstract For any object detector, the obtained box proposals or queries need to be classified and regressed towards ground truth boxes. 对于任何物体检测器来说&#xff0c;获得的…

Spring 声明式事务

Spring 声明式事务 1.Spring 事务管理概述1.1 事务管理的重要性1.2 Spring事务管理的两种方式1.2.1 编程式事务管理1.2.2 声明式事务管理 1.3 为什么选择声明式事务管理 2. 声明式事务管理2.1 基本用法2.2 常用属性2.2.1 propagation&#xff08;传播行为&#xff09;2.2.2 iso…

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查

目录 一、概念 栈溢出&#xff08;StackOverflowError&#xff09; 堆溢出&#xff08;OutOfMemoryError&#xff09; 二、排查方法 栈溢出&#xff08;StackOverflowError&#xff09; 堆溢出&#xff08;OutOfMemoryError&#xff09; 相关的Java代码示例 栈溢出 堆溢…

K8S pod无损上下线

在最近的K8s服务上线过程中&#xff0c;我发现了一些问题&#xff0c;更具体的说&#xff0c;我在使用阿里云k8s的过程中注意到&#xff1a;会出现slb短时RT增加&#xff0c;Pod部署初期就达到了扩容上限&#xff0c;并且开始大量的扩容&#xff0c;这无疑占用了大量的k8s资源。…

接口自动化测试之Yaml数据驱动封装!

一、数据驱动&#xff1a;pytest.mark.parametrize(&#xff09; 首先看个样本&#xff1a; import pytestclass TestData:# parametrize有两个值&#xff0c;一个是args_name:参数名&#xff0c;一个是args_value:参数值,可以有多个&#xff0c;进行数据解包# args_value可以…

【广州华锐互动VRAR】VR戒毒科普宣传系统有效提高戒毒成功率

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为人们的生活带来了前所未有的便利。在教育科普领域&#xff0c;VR技术的应用也日益广泛&#xff0c;本文将详细介绍广州华锐互动开发的VR戒毒科普宣传系统&#xff0…

serialVersionUID确保序列化版本

实现Serializable接口的目的是为类可持久化&#xff0c;比如在网络传输或本地存储&#xff0c;为系统的分布和异构部署提供先决条件。若没有序列化&#xff0c;现在我们所熟悉的远程调用&#xff0c;对象数据库都不可能存在&#xff0c; serialVersionUID适用于java序列化机制。…

万户协同办公平台ezoffice wpsservlet接口任意文件上传漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞描述 万户ezOFFICE协同管理平台是一个综合信息基础应用平台&am…

生成模型之Flow-Based model

Flow-Based Model 文章目录 Flow-Based Model简介总览数学基础jacobian matrixdeterminant行列式Change of variable theorem 架构常见几种方法coupling layer采用1*1卷积进行channel shuffle 简介 ​ Flow-Based对概率密度函数的直接建模&#xff0c;这使得它们在数据生成和推…

Ubuntu22.04 使用Docker部署Neo4j出错 Exited(70)

项目场景&#xff1a; 最近需要使用Neo4j图数据库&#xff0c;因此打算使用docker部署 环境使用WSL Ubuntu22.04 问题描述 拉下最新Neo4j镜像&#xff0c;执行命令部署 启动容器脚本 docker run -d -p 7474:7474 -p 7687:7687 \ --name neo4j \ --env "NEO4J_AUTHneo…