刷题记录:Codeforces Round #719 (Div. 3)
Codeforces Round #719 (Div. 3)
20210703。网址:https://codeforces.com/contest/1520。
没错,我是个做div3的蒟蒻……
A
大水题。
B
所有数位都一样的数是【ordinary数】(如1,22,333)。给一个数n,问小于等于n的【ordinary数】有多少。
直接用一个数组记录【ordinary数】,然后以n为key对数组进行二分搜索,返回的下标就是答案。二分搜索:STL的lower/upper_bound。
怎么得到这个数组呢?数组长这个样子,1-9,11-99,111-999。1-9先初始化好,11-99可以由1-9得到,111-999进而用11-99得到。a[i]=a[i-9]*10+i%9+1
,差不多这样的形式。
C
给一个n,用1到n*n的所有数,构造n*n的“不相邻矩阵”(就是,对于相邻的cell,数值不相邻)。
数值的相邻就是只差1。比如说,“1 2”“2 1”是相邻的,“1 3”“4 1”就不是相邻的。
如果可以构造出来,就输出这个矩阵。如果不能,就输出-1。
发现1可以(输出就是1),2不行。然后对于n≥3时,可以这样构造:
1 & n+1 & \cdots & (n-1)n+1\\
(n-1)n+2 & 2 & \cdots & (n-2)n+2\\
\vdots & \vdots & \ddots & \vdots \\
n+(n-1) & 2n+(n-1) & \cdots & n-1
\end{matrix}
\]
错位一下。
D
我们有一个n个整数的数组,统计一种pair的个数。
什么样的pair呢?i<j且a_j-a_i=j-i。
这个我一开始居然没想到怎么做……其实很简单。
\\
a_j-j=a_i-i
\]
就是这样!读入的时候就记录a[i]-i,然后对这个一通排序,对所有相等的值算一个\(C_n^2\)组合数,求和就ok了。
好像需要long long。
E
有点像华容道,只不过是1维的。
n个位置,每一个位置有物品/空着,移动物品多少次可以使所有物品聚在一起?
移动物品一次:把【一个】物品移动【一个位置】。
分析一下:
假设现在有两堆物品,左边一堆共a个物品,右边一堆共b个物品,它们之间距离是l。我们要把它们移成一堆。左边一堆往右移x,右边一堆往左移y,cost是ax+by,其中x+y=l。为了让cost更小,我们会让物品更少的那一堆移动,物品更多的堆原地不动。
想想一个坐标把这n个位置分成两半,我们把这个坐标叫做分割线。【分割线两侧的物品一定会分别聚成两堆】。因为它们最终要聚成一堆,如果最终这一堆物品的中心在左边,那么左边的物品围绕这个中心聚起来,右边的物品迁徙到紧靠分割线。最终物品中心在右边也是一样。不过这是感性的想法,(也不想去严格证明)。
所以,如果分割线两侧物品数量相等呢?分割线两侧的两堆物品数量相等,意味着哪一堆移动都无所谓,为什么不两堆一块移,一起向分割线聚拢呢?此时我们意识到,这样的分割线就是最终物品堆的中心!
所以,第一步把序列扫一遍确定物品个数,第二步把序列再扫一遍确定分割线位置。然后,对于左边的每一个物品,一个一个移动到中间并记录次数,右边也是如此。
F
读题读了半天……
有一个只有01的数组,我们要找第k个0的位置。我们可以发起询问,格式是“[l,r]的总和是多少”,通过简单处理就可以得到“[l,r]内有多少个0”的信息。
我们有t个询问,每个询问给出一个k,问第k个0的位置。并且,对于每一个被询问的0,我们找到它之后,它都会变成1。
举个例子:000。第一个0的位置是1,(然后0->1,变成100),再问第一个0的位置就是2了。
对于每一个询问,我们都二分搜索来找。为了问尽可能少的次数,我们记忆化搜索。维护一个数组dp,dp[i]表示[1,i]中有多少个0。(因为发现空间不够开二维dp数组。)
正确性:问“[l,r]中多少个0”的时候,第一种情况:l=1,得到的就是dp[r];第二种情况:l不是1,此时我们已经搜过l之前的位置,发现[1,l-1]并没有那么多0,所以转而搜l后面的位置,所以dp[l-1]已经被算过,【[l,r]中0的个数】=dp[r]-dp[l-1],可以顺利得到dp[r]。
询问结束后0->1的处理:操作dp数组,for i从pos到n做--dp[i],如果dp[i]已经被算过。
G
在一个地图里从左上角跑到右下角。地图的每一个位置是障碍(-1),空地(0),传送器(大于0的整数cost)。可以从一个传送器瞬移到另一个传送器,代价是两个传送器的cost相加。
首先明确一个事情。如果我们要用传送器,肯定只传送1次。我们从A传送到B,然后几经辗转跑到C再传送到D,B的代价、C的代价、B跑到C的代价都大于0,所以为什么不直接从A传送到D呢?
明确了这个之后,就好办多了!最优路线只可能有两种,要不是直接跑,要不是中间传送一次。
对于传送的方案,从左上角开始用bfs算【每一个传送器离左上角的距离+传送器本身cost】然后选值最小的,从右下角开始用bfs算【每一个传送器离右下角的距离+传送器本身cost】然后选值最小的,相加。
对于直接跑的方案,直接从左上角bfs到右下角。
刷题记录:Codeforces Round #719 (Div. 3)的更多相关文章
- Codeforces Round #719 (Div. 3) C. Not Adjacent Matrix
地址 Problem - C - Codeforces 题意 每个格子,该格子和相邻的格子的值不能相同 题解 思维题, 先从1~n输出奇数,再输出偶数 代码 #include <iostream ...
- 【做题】Codeforces Round #436 (Div. 2) F. Cities Excursions——图论+dfs
题意:给你一个有向图,多次询问从一个点到另一个点字典序最小的路径上第k个点. 考虑枚举每一个点作为汇点(记为i),计算出其他所有点到i的字典序最小的路径.(当然,枚举源点也是可行的) 首先,我们建一张 ...
- 【做题】Codeforces Round #429 (Div. 2) E. On the Bench——组合问题+dp
题目大意是给你n个数,求相邻两数相乘不是完全平方数的排列数. 一开始看到这题的时候,本人便想给相乘为完全平方数的数对建边,然后就写萎了... 后来通过集体智慧发现这个重要性质:对于自然数a,b,c,若 ...
- 【做题】Codeforces Round #453 (Div. 1) D. Weighting a Tree——拆环
前言:结论题似乎是我的硬伤…… 题意是给你一个无向图,已知连接到每一个点的边的权值和(为整数,且属于区间[-n,n]),需要求出每条边权值的一个合法解(都要是在区间[-2*n^2,2*n^2]内的整数 ...
- 套题:Codeforces Round #194 (Div. 1) (2/5)
A. Secrets http://www.cnblogs.com/qscqesze/p/4528529.html B. Chips http://www.cnblogs.com/qscqesze/p ...
- DP刷题记录
目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...
- 刷题记录:Codeforces Round #724 (Div. 2)
Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...
- 刷题记录:Codeforces Round #734 (Div. 3)
Codeforces Round #734 (Div. 3) 20210920.网址:https://codeforces.com/contest/1551. 编程细节:下标定义不要一会[1,n]一会 ...
- 刷题记录:Codeforces Round #739 (Div. 3)
Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...
随机推荐
- Halodoc使用 Apache Hudi 构建 Lakehouse的关键经验
Halodoc 数据工程已经从传统的数据平台 1.0 发展到使用 LakeHouse 架构的现代数据平台 2.0 的改造.在我们之前的博客中,我们提到了我们如何在 Halodoc 实施 Lakehou ...
- MySQL并行复制(MTS)原理(完整版)
目录 MySQL 5.6并行复制架构 MySQL 5.7并行复制原理 Master 组提交(group commit) 支持并行复制的GTID slave LOGICAL_CLOCK(由order c ...
- 如何优化PlantUML流程图(时序图)
这篇文章用来介绍,如何画出好看的流程图. 1. 选择合适的组件 1.1 plantuml官方提供的组件 1.2 加载图片 1.2.1 加载本地图片 1.2.2 加载网络图片 1.2.3 图片资源 2. ...
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求,点我 -> 解密 Redis 为什么这么快的秘密. 把 Redis 作 ...
- JS:比较运算符
比较运算符有如下: 1.== 等于: 值相等 var a = "0"; var b = 1; var c = 0; console.log(a==0); //true consol ...
- 安装@parcel/transformer-image注意的问题
安装前配置 npm config get cache 键入以上命令即可找到npm缓存路径,然后找到路径下的_libvips文件夹. 一般需要以下两个文件,这里以win环境为例.把文件放到_libvip ...
- Vue搭建后台系统需要做的几点(持续更新中)
前言 持续更新 一.UI框架 推荐 Elemnet ui 二.图表 vue-schart npm install vue-schart -S <template> <div id=& ...
- C#中将字符串转换成数值
Convert.ToInt32("999");
- git 删除、合并多次commit提交记录
合并多次记录 1. git log找到要合并的记录的数量. 2. git rebase -i HEAD~5 将最上面一个的记录选为pack,下面记录都改为s. ================= 删除 ...
- Unity3D学习笔记6——GPU实例化(1)
目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次 ...