Educational Codeforces Round 169 (Rated for Div. 2)

前言

       电脑显示屏一闪一闪地感觉要拿去修了,比赛时重启了好几次。

        手速场,E 题没学过 Sprague-Grundy 吃了亏,好在前四题都一发过才不至于掉分。

        Standings:1214

        题目链接:Dashboard - Educational Codeforces Round 169 (Rated for Div. 2) - Codeforces

A. Closest Point

        题意:

        给一个集合表示数轴上的一些点,你需要在数轴上加入一个不同于集合内任何元素的整数点,使得这个点是所有集合内的点最近点,也就是这个点到所有点的路上不能有其他点。

        思路:

        显然只有 n = 2 时且两个点不是相邻的整数才有解。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int T,n,a[105];int main()
{scanf("%d",&T);while (T --){scanf("%d",&n);for (int i = 1;i <= n;++ i) scanf("%d",&a[i]);sort(a + 1,a + n + 1);int flag = 1;for (int i = 2;i <= n;++ i)if(a[i] - a[i - 1] <= 1){flag = 0;break;}if(n > 2) flag = 0;if(flag) printf("YES\n");else printf("NO\n"); }return 0;
}

B. Game with Doors

        题意:

        有 100 个房间排成一排,相邻房间有门连接,告诉你两个人可能所在的房间区间(是一段连续的子区间),求最少锁上多少间房门能让这两个人所在的房间不能互通。

        思路:

        分类讨论即可,懒得写了。

#include<cstdio>
#include<cstring>
using namespace std;int T,l,r,x,y;int main()
{scanf("%d",&T);while (T --){scanf("%d%d%d%d",&l,&r,&x,&y);int tmp,ans;if(l > x || l == x && r < y) tmp = l,l = x,x = tmp,tmp = r,r = y,y = tmp;if(r < x) ans = 1;else if(r >= x && y >= r) ans = (r - x) + (y > r) + (l < x);else if(r >= x && y < r) ans = (y - x) + (r > y) + (l < x);printf("%d\n",ans);}return 0;
}

C. Splitting Items

        题意:

        给一串数字作为分值,两个人轮流取,总得分分别记作 A 和 B,你可以对原数列进行操作,给任意数量的数字增加一个数,增加的总和不能超过 k ,求 A - B 的最小值。

        思路:

        显然贪心,从大到小排序后,A 肯定会取奇数位上的数字,尽可能地增加偶数位上的数字使 B 更大,但是不能超过前一位 A 取的数,否则这个数就会被 A 拿走。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;#define N 200005int T,n,k,a[N];
long long ans;int cmp(int x,int y) { return x > y ; }int main()
{scanf("%d",&T);while (T --){scanf("%d%d",&n,&k);for (int i = 1;i <= n;++ i) scanf("%d",&a[i]);sort(a + 1,a + n + 1,cmp);ans = 0ll;for (int i = 1;i <= n;++ i){if(i & 1) ans += 1ll * a[i];else{int now = a[i - 1] - a[i];if(k >= now) a[i] = a[i - 1],k -= now;else a[i] += k,k = 0;ans -= 1ll * a[i];}}printf("%lld\n",ans);}return 0;
}

D. Colored Portals

        题意:

        给 n 个城市,城市 i 和 j 之间的距离是 |i - j| ,每个城市有两种传送门,可以通过相同的传送门在城市之间穿梭,有若干个询问找出城市 x 到城市 y 的最短距离。

        思路:

        显然要么直达,要么只中转一次,要么无法到达。

        中转的情况分情况讨论二分查找使得总距离最短的那个城市即可。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;#define N 200005int T,n,q,ans,a[6][N],c[6],id[N],inv[6];
char s[5];int min(int x,int y) { return x < y ? x : y ; }int find(int k,int x,int y)
{int l,r,mid,now,tmp;l = 1,r = c[k],now = 0;while (l <= r){mid = (l + r) >> 1;if(a[k][mid] > x) now = a[k][mid],r = mid - 1;else l = mid + 1;}if(x < now && now < y) return y - x ;l = 1,r = c[k],now = 0,tmp = 1e9;while (l <= r){mid = (l + r) >> 1;if(a[k][mid] < x) now = a[k][mid],l = mid + 1;else r = mid - 1;}if(now) tmp = min(tmp,x - now + y - now);l = 1,r = c[k],now = 0;while (l <= r){mid = (l + r) >> 1;if(a[k][mid] > y) now = a[k][mid],r = mid - 1;else l = mid + 1;}if(now) tmp = min(tmp,now - x + now - y);return tmp;
}int main()
{for (int i = 0;i < 6;++ i) inv[i] = 5 - i;scanf("%d",&T);while (T --){memset(c,0,sizeof c);scanf("%d%d",&n,&q);for (int i = 1;i <= n;++ i){cin >> s + 1;if(s[1] == 'B' && s[2] == 'G') a[0][++ c[0]] = i,id[i] = 0;if(s[1] == 'B' && s[2] == 'R') a[1][++ c[1]] = i,id[i] = 1;if(s[1] == 'B' && s[2] == 'Y') a[2][++ c[2]] = i,id[i] = 2;if(s[1] == 'G' && s[2] == 'R') a[3][++ c[3]] = i,id[i] = 3;if(s[1] == 'G' && s[2] == 'Y') a[4][++ c[4]] = i,id[i] = 4;if(s[1] == 'R' && s[2] == 'Y') a[5][++ c[5]] = i,id[i] = 5;}while (q --){int x,y,tmp,ix,iy;scanf("%d%d",&x,&y),ans = 1e9;if(x > y) tmp = x,x = y,y = tmp;ix = id[x],iy = id[y];if(ix == inv[iy]){for (int i = 0;i < 6;++ i){if(i == ix || i == iy) continue;ans = min(ans,find(i,x,y));}}else ans = y - x;if(ans == 1e9) printf("-1\n");else printf("%d\n",ans);}}return 0;
}

E. Not a Nim Problem

        题意:

        常规的取石子游戏变形,限制就是只能取和当前堆数互质的数目。

        思路:

        经典的博弈论题目,要用到 Sprague-Grundy 函数,比赛后恶补了一下,发现还挺有意思。

        感觉瞪眼法很难看出有什么规律,打个表就很显而易见了:

        1. sg(1) = 1

        2. 若 x 为偶数,则 sg(x) = 0

        3. 其他情况,设 x 的最小质因子为 p ,则 sg(x) = p 在质数中从小到大的排位(记作num)

        证明:

        1 和 2 是显然的,这里我们主要考虑 3 ,用数学归纳法证明。

        假设 1 ~ x - 1 都满足上述条件,考虑 sg(x) 的值,要证 x 的后继中有 0 ~ num - 1 但是不能有num。

        对于 x ,我们肯定可以取 1 个或者 x - 1 个石子,这样后继就是 sg(x - 1) 和 sg(1) ,分别对应 0 和 1。接着,肯定也可以取到剩下小于 p 个石子,即 2 ~ p - 1,那么后继就是 sg(2) , sg(3), ... , sg(p - 1),根据前面的条件都满足,这些后继肯定包含了 2 ~ num - 1 的值。综上,后继中一定有 0 ~ num - 1。

        那么后继能不能有 num 呢?反证。假设有,那么意思是后继中也有某一堆石子数,满足其最小质因子为 p ,这样这堆就和原来的互质了,违背题意。

        因此,sg(x) = num 。

#include<cstdio>
#include<cstring>
using namespace std;#define N 10000007int T,n,check[N],prime[N],p[N],num[N],cnt,tmp,ans;void ola()
{check[1] = 1,cnt = 0;for (int i = 2;i < N;++ i){if(!check[i]) prime[++ cnt] = i,p[i] = i;for (int j = 1;j <= cnt;++ j){if(i * prime[j] >= N) break;check[i * prime[j]] = 1,p[i * prime[j]] = prime[j];if(!(i % prime[j])) break;}}for (int i = 1;i <= cnt;++ i) num[prime[i]] = i;return;
}int main()
{ola();scanf("%d",&T);while (T --){scanf("%d",&n),ans = 0;for (int i = 1,x;i <= n;++ i){scanf("%d",&x);if(x == 1) tmp = 1;else if(!(x & 1)) tmp = 0;else tmp = num[p[x]];ans ^= tmp;}if(ans) printf("Alice\n");else printf("Bob\n");}return 0;
}

F. Make a Palindrome

        题意:

        给一个长度为 n 的整数序列 a ,定义 f(b) 表示使得序列 b 回文的最少操作数,每次操作可以选择序列的任意一端,要么合并这一端的两个数;要么让端点的这个数拆分成两个数,使得这两个数之和与原来相等。计算序列 a 的所有子序列的 f 值之和。

        思路:

        首先不难发现,合并和拆分操作的意义是一样的,即当你选择一次合并操作的时候,也一定可以使用一次拆分操作满足相同的回文要求,只是序列中的数字不一样而已。

        我们考虑某个序列 p ,我们用最小的操作使序列两端的数字之和相等,这样的条件是序列的某个前缀和与后缀和相等,然后我们只用合并操作就可以达到这一条件。那么得到剩下的不合法序列就是一个子序列,我们可以用分治考虑它。

        我们记某一段区间 [l,r] 的前缀和为 s ,考虑它需要的操作数:

        找出最大的子区间 [x,y] 使得 s_{x - 1} - s_{l-1} = s_y - s_r , 即 s_r+s_{l-1} = s_y + s_{x-1},因此我们发现所有 s_r+s_{l-1} 相等的区间都是一组,并且一定是包含关系(因为前缀和是单调的,一个增加另一个必须减少,即区间左端点右移的时候,区间右端点一定左移)。于是每两个相邻区间都会有一个操作数的差值,我们先统计假设所有组的区间都以最大长度的那个区间计算时需要的操作数,再减去所有多计算的操作数即可。

#include<cstdio>
#include<cstring>
#include<map>
using namespace std;#define N 2005int T,n,a[N],pre[N],ans;
map< int, int > mpl,mpr;int main()
{scanf("%d",&T);while (T --){scanf("%d",&n),pre[0] = ans = 0;for (int i = 1;i <= n;++ i) scanf("%d",&a[i]),pre[i] = pre[i - 1] + a[i];map< int, int > mp;for (int i = 0;i < n;++ i)for (int j = i;j <= n;++ j)ans += j - i - 1,++ mp[pre[i] + pre[j]];for (auto [x,y] : mp) ans -= y * (y - 1);for (int i = 0;i <= n;++ i) ans += mp[2 * pre[i]]; printf("%d\n",ans);}return 0;
}

总结

        这套比赛主要是博弈论的 E 题没有学过吃了亏,但是这是无关紧要的,遇到不会的知识点时去填坑就好了,主要还是像 F 这种难度的计数题比较难想,需要大量做题大量思考来引起质变。

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

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

相关文章

【架构设计】-- aarch(ARM) and X86

1、aarch(ARM) 架构 &#xff08;1&#xff09;操作系统支持&#xff1a;早期为 32 位操作系统&#xff0c;目前大部分都是 64 位操作系统 &#xff08;2&#xff09;全称&#xff1a;Advanced RISC Machine&#xff0c;由英国ARM Holdings plc公司开发 这种架构主要⽤于智能…

2.11、matlab中for循环,if else判断语句,break和continue用法以及switch case语句使用

1、前言 在MATLAB中,for循环用于迭代一个固定次数的循环。可以使用if else语句在循环中进行条件判断,根据条件的不同执行相应的代码块。break和continue可以用于控制循环的执行流程,break用于提前结束循环,而continue用于跳过当前循环迭代,继续下一次迭代。switch case语…

Android车载蓝牙音乐实例(附Demo源码):实现手机播放音乐后车机应用显示音乐名称,歌手,专辑名。且可控制上一曲下一曲,暂停播放功能

一、功能需求 功能需求是在Android10以上设备上实现蓝牙音乐功能&#xff0c;细分为两个功能点&#xff1a; 1、手机和车载设备实现蓝牙连接 &#xff08;本Demo文只做监听蓝牙连接状态&#xff0c;需手动到设置中连接蓝牙&#xff09; 2、连接蓝牙成功后手机播放音乐时车载…

Python常用内置函数(二)

Python 常用内置函数及示例&#xff08;续&#xff09; 在前面的基础上&#xff0c;我们将继续介绍另外50个常用的Python内置函数&#xff0c;并给出每个函数的简短说明和示例。 1. callable() 功能: 检查对象是否可调用。示例:def func(): pass print(callable(func)) # 输…

leetcode 递归(回溯)——java实现

递归算法与DFS类似&#xff0c;也与二叉树的先序遍历类似 以下摘自 leetcode回溯算法入门级详解 回溯法 采用试错的思想&#xff0c;它尝试分步的去解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff…

了解蜜罐网络技术:网络安全中的诱捕与防御

在网络安全领域&#xff0c;攻击者和防御者之间的斗争日趋激烈。为了更好地识别、分析和抵御网络攻击&#xff0c;安全专家开发了一种称为蜜罐网络技术&#xff08;Honeypot Network Technology&#xff09;的防御策略。蜜罐网络不仅能够吸引攻击者进入虚假的环境&#xff0c;从…

MySQL笔记01: MySQL入门_1.2 MySQL下载安装与配置

2.2 MySQL下载安装与配置 2.2.1 MySQL下载 MySQL中文官网&#xff1a;https://www.mysql.com/cn/ MySQL英文官网&#xff1a;https://www.mysql.com/ MySQL官网下载地址&#xff1a;https://www.mysql.com/downloads/ &#xff08;1&#xff09;点击“MySQL Community (GPL) Do…

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

catvod、TVBox源的解析过程分析和Spider参数覆盖问题解决

文章目录 TVBox官网源内容的结构 Spider参数覆盖问题Spider参数覆盖问题的解决脚本附录&#xff1a;核心代码分析首页详情页面播放界面获取播放信息源内容配置类Jar包解析类Js解析类Spider TVBox官网 TVBox项目索引&#xff1a;https://github.com/o0HalfLife0o/TVBoxOSC/ 完…

LibreWolf使用记录

之前一直使用Firefox作为个人主力浏览器&#xff0c;工作上由于有些网页兼容问题&#xff0c;一直使用的是Chrome。自从看了Eric Murphy 关于浏览器的分类之后, 出于对隐私的考虑&#xff0c;还是决定把chrome换成Brave&#xff0c;同时考虑对Firefox进行harden或者使用LibreWo…

从力扣中等+困难题+表白HTML测试 -- 文心快码(Baidu Comate)

0 写在前面 &#xff08;通过如下链接/二维码进入官网注册&#xff0c;并在IDE使用三次及以上可以找我领计算机基础/ML/DL 面经/知识点一份~&#xff09; 官网地址&#xff1a;Baidu Comate Step1 打开文心快码&#xff08;Baidu Comate&#xff09;官网&#xff0c;点击「免…

[Python可视化]空气污染物浓度地图可视化

[Python可视化]空气污染物浓度地图可视化&#xff0c;果然是路边浓度最大 在本篇文章中&#xff0c;我将展示如何使用 Python 结合 OSMnx、NetworkX 和 GeoPandas 等库&#xff0c;计算给定路径的最短路线&#xff0c;并基于该路径穿过的网格单元计算总污染量。最终&#xff0c…

【ORACLE】listagg() 函数

在Oracle数据库中&#xff0c;LISTAGG 函数是一个非常有用的聚合函数&#xff0c;它能够将多个行的字符串值连接成一个单独的字符串。这个函数在处理需要将多行数据合并为一行数据的场景中特别有用&#xff0c;比如生成报表或者构建复杂的字符串输出。 基本语法 LISTAGG 函数…

k8s - Secret实践练习

参考文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ 这个和ConfigMap很相似&#xff0c;这里选两个做下测试&#xff0c;就不过多赘述了 简介 Secret 类似于 ConfigMap 但专门用于保存机密数据。 Secret 是一种包含少量敏感信息例如密码…

<数据集>鸟类识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;16287张 标注数量(xml文件个数)&#xff1a;16287 标注数量(txt文件个数)&#xff1a;16287 标注类别数&#xff1a;10 标注类别名称&#xff1a;[Chestnut Munia, Zebra Dove, Garden Sunbird, Collared Kingfish…

一篇文章入门Java虚拟机(JVM)

JVM全称是Java Virtual Machine&#xff0c;中文译名Java虚拟机。本质上是一个运行在计算机上的程序 一&#xff0c;JVM的功能 功能描述解释和运行对字节码文件中的指令&#xff0c;实时的解释成机器码&#xff0c;让计算机执行内存管理自动为对象、方法等分配内存&#xff1…

ChatGPT 3.5/4.0 新手使用手册

ChatGPT 3.5/4.0 新手使用手册 一、引言 ChatGPT 是由 OpenAI 开发的一种基于人工智能技术的聊天机器人&#xff0c;它能够自动生成自然语言的响应&#xff0c;与用户进行高质量的对话。ChatGPT 3.5 和 4.0 是该系列的最新版本&#xff0c;它们在自然语言处理、对话能力和知识…

海山数据库(He3DB)源码详解:CommitTransaction函数源码详解

文章目录 海山数据库(He3DB)源码详解&#xff1a;CommitTransaction函数1. 执行条件2. 执行过程2.1 获取当前节点状态&#xff1a;2.2 检查当前状态&#xff1a;2.3 预提交处理&#xff1a;2.4 提交处理&#xff1a;2.5 释放资源&#xff1a;2.6 提交事务&#xff1a; 作者介绍…

数据结构-线性表-了解循环链表

了解循环链表 循环链表是一种特殊的链表结构&#xff0c;其中最后一个节点的指针指向头节点&#xff0c;从而形成一个闭环。循环链表可以分为两种类型&#xff1a;单循环链表和双循环链表。 1. 单循环链表&#xff08;Singly Circular Linked List&#xff09; 定义&#xf…

Qt第十八章 XML和Json格式解析

文章目录 JSON格式解析Json生成案例 XML简介与HTML的区别格式XML解析流的方式DOM XML生成 JSON与XML的区别比较 JSON 格式 JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名 六个构造字符 开始和结束数组&#xff1a;[ ]开始和结束对象&#x…