CF div2 994 (A~E)
VP赛时三题,自我感觉发挥不错,唯一不满意的地方在于D题完全没有思路。
A
答案最多为2,因为最坏情况即为先将整个区间合并为一个数,若这个数不是0,则再将这个数变为0。
所以3种情况分类讨论即可:
- 全是0,则不需要操作 -> \(0\)
- 只有一段非\(0\)连续区间 -> \(1\)
- 不止\(1\)个非\(0\)连续区间 -> \(2\)
B
首先,若只出现了一种字符,则一定可行,因为若只出现\(p\),则可令序列为\([1,2,...,n]\);若只出现\(s\)则可令序列为\([n,n-1,...,1]\)。
否则,两种字符一定都有。考虑任意一对\(p,s\):
设形成的前缀\((p)\)为\(1到k1\)的排列,后缀\((s)\)为\(1到k2\)的排列
易得前缀和后缀必然相互包含
所以检查是否有一对不相互包含的前后缀即可,实现不再赘述。
C
构造题
此题赛时的做法分讨得比较麻烦,但好在保证了正确性,还是官方题解的做法比较简洁。但感觉此题复盘的意义不大,故不再赘述。
D
\(dp\)
若没有对每一行循环左移操作,则就是一个普通的走迷宫\(dp\)。
由于每一行最多只会移动\(m - 1\)次,而\(n,m <= 200\),所以可以猜测是一个状态表示为\([行数][列数][对应行的移动次数]\)的\(dp\)。
状态表示:
\(g[i][j][k] :\) 从\((1,1)\)走到\((i,j)\),且第\(i\)行循环移动了\(k\)次,最小花费。
\(f[i][j] :\) 从\((1,1)\)走到\((i,j)\),最小花费。
考虑状态转移(此题重点):
由于每次只会向右或向下移动一格,所以\((i,j)\)的状态只会从\((i-1,j)\)和\((i,j-1)\)转移过来。
但由于引入了可对行循环左移的操作,使得这两种转移的方式并不一样:
1.\((i,j-1)\) -> \((i,j)\) : 由于题目明确要求必须在开始移动之前才能做循环左移操作,故对于行内的转移来说,必须要从当前行移动次数相同的状态转移过来。即:
g[i][j][k] <- g[i][j-1][k] + a[i][j`]
其中\(a[i][j`]\)表示第\(i\)行向左移动了\(k\)次后\((i,j)\)位置的数字
2.\((i-1,j)\) -> \((i,j)\) : 由于只能对行操作,因此行与行之间的转移其实是独立的。即从一行向下移动到另一行时,状态转移与当前行的循环移动次数是无关的。因此:
g[i][j][k] <- f[i-1][j] + k * w + a[i][j`]
而\(f\)的转移即为:
f[i][j] = min(g[i][j][0到m-1])
E
交互 + 二分,个人感觉非常不错的一道题。
首先要想明白一点:由于\(1\)的位置不确定,所以每一次询问的真假性也是不确定的。所以要想办法破掉这个牢笼,让每一次询问的真假性得以确定,从而获得有用信息。
假设这段区间中没有1,即为全\(0\)区间,则我们可以知道,0一定是真的回答,1一定是假的回答,因为所有区间的和均为0。这样区间长度与回答之间就具有了二段性:越长的区间回答越容易假,越短的区间回答越容易真。通过二分,就可以在\(O(logn)\)时间内确定出\(k\)。
所以可以考虑:确定出来\(1\)在哪个子区间内,这样其余的区间就全0了。可以利用上述方法确定\(k\)的值。
具体地,可以确定出\(1\)是在整个序列的前一半还是后一半:即为官方题解的做法,通过询问\(2\)次\(1/4\)长度区间方法确定出了\(1\)的分布,自己确实想不到qwq...
同样,对含有\(1\)的那一半区间再询问\(1\)次,即可以确定出\(k\)与\(n/2\)的大小关系。
这样,就将区间分为了两半:一半全\(0\),一半含有一个\(1\)。
此时又分为两种情况:
- \(k<=n/2\):直接对长度为\(n/2\)的全0区间二分,原理和上面说的一样。
- \(k>n/2\): 由于全\(0\)区间长只有\(n/2\),故只用全\(0\)区间时只能对\(k<=n/2\)的情况进行判断。那么\(k>n/2\)时怎么办呢?有个巧妙的办法:将另一半含1区间和该全0区间的子区间结合,这样构造的区间和一定为\(1\),并且区间长度范围是\([n/2+1,n]\)。这样就转化为了和上述一模一样的做法,同样具有二段性,二分即可。
CF div2 994 (A~E)的更多相关文章
- cf div2 234 D
D. Dima and Bacteria time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 离线dfs CF div2 707 D
http://codeforces.com/contest/707/problem/D 先说一下离线和在线:在线的意思就是每一个询问单独处理复杂度O(多少多少),离线是指将所有的可能的询问先一次都处理 ...
- cf div2 239 D
D. Long Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- cf div2 236 D
D. Upgrading Array time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- cf div2 237 D
D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...
- cf div2 238 D
D. Toy Sum time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- cf div2 238 c
C. Unusual Product time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- cf div2 235 D
D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...
- cf div2 234 E
E. Inna and Binary Logic time limit per test 3 seconds memory limit per test 256 megabytes input sta ...
- CF div2 D BFS
http://codeforces.com/contest/676/problem/D 题目大意: 勇者去迷宫杀恶龙.迷宫是有n*m的方格子组成的.迷宫上有各种记号,这些记号表达着能走的方向.当且仅当 ...
随机推荐
- 【Azure Bot Service】部署Python ChatBot代码到App Service中
问题描述 使用Python编写了ChatBot,在部署到App Service,却无法启动. 通过高级工具(Kudu站点:https://<your site name>.scm.chin ...
- QT Creator项目路径设置
1.一些中间文件的生成路径的设置 MOC_DIR = temp/moc RCC_DIR = temp/rcc UI_DIR = temp/ui OBJECTS_DIR = temp/obj 这样设置之 ...
- python 中的[:-1]和[::-1]的具体使用
案例 a='python' b=a[::-1] print(b) #nohtyp c=a[::-2] print(c) #nhy #从后往前数的话,最后一个位置为-1 d=a[:-1] #从位置0到位 ...
- PbRL | Christiano 2017 年的开山之作,以及 Preference PPO / PrefPPO
PrefPPO 首次(?)出现在 PEBBLE,作为 pebble 的一个 baseline,是用 PPO 复现 Christiano et al. (2017) 的 PbRL 算法. For eva ...
- callable结合FutureTask的多线程使用(免打扰模式)
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.ut ...
- linux模拟HID USB设备及wireshark USB抓包配置
目录 1. 内核配置 2. 设备配置 附 wireshark USB抓包配置 笔者开发USB设备时的一些记录 1. 内核配置 内核启用USB Gadget,使用fs配置usb device信息. De ...
- 德承工控机DA-1000 RS-485串口设置
由于一般情况下调试串口常使用RS-485转USB接口来进行调试,但是USB接口在长时间的调试下,接口容易松动,通讯也比较不稳定容易中断,所以改为DB9接口的RS-485来调试,稳固不松脱.抗干扰能力强 ...
- Pytorch 手写数字识别 深度学习基础分享
本篇是一次内部分享,给项目开发的同事分享什么是深度学习.用最简单的手写数字识别做例子,讲解了大概的原理. 手写数字识别 展示首先数字识别项目的使用.项目实现过程: 训练出模型 准备html手写板 fl ...
- 使用Tailwind CSS的几个小Tips
前情 Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别.它的工作原理是扫描所有 HTML 文件.JavaScript 文件以及任何模板中的 CSS 类名,然 ...
- Mysql的个人习惯
一定要有主键 一般使用的innodb引擎中会根据主健创建聚簇索引,这种方式会使得数据排列的更连续,减少随机IO 关于数据长度 考虑数据范围,够用的前提下,数据长度是越简单越好,数据类型是越小越好. 尽 ...