VP赛时三题,自我感觉发挥不错,唯一不满意的地方在于D题完全没有思路。

A

答案最多为2,因为最坏情况即为先将整个区间合并为一个数,若这个数不是0,则再将这个数变为0。

所以3种情况分类讨论即可:

  1. 全是0,则不需要操作 -> \(0\)
  2. 只有一段非\(0\)连续区间 -> \(1\)
  3. 不止\(1\)个非\(0\)连续区间 -> \(2\)

code

B

首先,若只出现了一种字符,则一定可行,因为若只出现\(p\),则可令序列为\([1,2,...,n]\);若只出现\(s\)则可令序列为\([n,n-1,...,1]\)。

否则,两种字符一定都有。考虑任意一对\(p,s\):

设形成的前缀\((p)\)为\(1到k1\)的排列,后缀\((s)\)为\(1到k2\)的排列

易得前缀和后缀必然相互包含

所以检查是否有一对不相互包含的前后缀即可,实现不再赘述。

code

C

构造题

此题赛时的做法分讨得比较麻烦,但好在保证了正确性,还是官方题解的做法比较简洁。但感觉此题复盘的意义不大,故不再赘述。

code

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])

code

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\)。

此时又分为两种情况:

  1. \(k<=n/2\):直接对长度为\(n/2\)的全0区间二分,原理和上面说的一样。
  2. \(k>n/2\): 由于全\(0\)区间长只有\(n/2\),故只用全\(0\)区间时只能对\(k<=n/2\)的情况进行判断。那么\(k>n/2\)时怎么办呢?有个巧妙的办法:将另一半含1区间和该全0区间的子区间结合,这样构造的区间和一定为\(1\),并且区间长度范围是\([n/2+1,n]\)。这样就转化为了和上述一模一样的做法,同样具有二段性,二分即可。

code

CF div2 994 (A~E)的更多相关文章

  1. cf div2 234 D

    D. Dima and Bacteria time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  2. 离线dfs CF div2 707 D

    http://codeforces.com/contest/707/problem/D 先说一下离线和在线:在线的意思就是每一个询问单独处理复杂度O(多少多少),离线是指将所有的可能的询问先一次都处理 ...

  3. cf div2 239 D

    D. Long Path time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  4. cf div2 236 D

    D. Upgrading Array time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  5. cf div2 237 D

    D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...

  6. cf div2 238 D

    D. Toy Sum time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  7. cf div2 238 c

    C. Unusual Product time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. cf div2 235 D

    D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...

  9. cf div2 234 E

    E. Inna and Binary Logic time limit per test 3 seconds memory limit per test 256 megabytes input sta ...

  10. CF div2 D BFS

    http://codeforces.com/contest/676/problem/D 题目大意: 勇者去迷宫杀恶龙.迷宫是有n*m的方格子组成的.迷宫上有各种记号,这些记号表达着能走的方向.当且仅当 ...

随机推荐

  1. Golang 开源库分享:anko - 给 Go 加点“脚本魔法”

    GitHub 仓库链接:https://github.com/mattn/anko 1. anko 是干嘛用的? anko 是一个可以让 Go 项目支持脚本语言的小工具.换句话说,就是我们可以给 Go ...

  2. CTF-CRYPTO-RSA

    CTF-CRYPTO-RSA 只是个人理解,可能有不正确的地方,具体RSA算法参考:http://8.146.200.37:4100/crypto/asymmetric/rsa 1.RSA算法概述 R ...

  3. python中os模块的方法总结

    #返回当前的工作目录os.getcwd #print(os.getcwd()) #改变一个目录 chdir(path) #列出所有的文件或者目录 listdir(path) #print(os.lis ...

  4. 基于sqli-labs Less-1的sql联合注入详解

    SQLi Labs 是一个专为学习和测试 SQL 注入漏洞设计的实验平台,旨在帮助安全研究人员.开发者和网络安全爱好者深入理解并实践各种 SQL 注入攻击.该平台提供了一系列精心设计的实验环境,模拟真 ...

  5. 一文彻底弄懂JUC工具包的Semaphore

    Semaphore 是 Java 并发包 (java.util.concurrent) 中的重要工具,主要用于控制多线程对共享资源的并发访问量.它可以设置"许可证"(permit) ...

  6. html代码新手教学

    HTML 是超文本标记语言(HyperText Markup Language)的缩写,是用来描述网页结构的标记语言.在这篇教学中,我们将介绍一些 HTML 基础知识,帮助新手快速学习并掌握如何编写简 ...

  7. 【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  8. 不错的PHP扩展

    不错的PHP扩展 ext name ext description ds data structure 提供list hash queue等数据结构 igbinary 数据压缩(速度快 压缩后内容小) ...

  9. (Python基础教程之四)Python中的变量的使用

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  10. JAVA并发编程学习笔记之Unsafe类

    java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法all ...