赛时做的,结果一直在卡D题。打得很失败的一场。

ABC

略。

D

题意可以转化为:给定\(m\)个黑色或白色的格子,其中:

  1. 每个黑色格子和\((1,1)\)作为对角线顶点,构成一个黑色矩形
  2. 每个白色格子和\((n,n)\)作为对角线顶点,构成一个白色矩形

要求任意一对黑色矩形与白色矩形不相交,判断是否可行。

可以转化为,不能出现任何一个白点,它的\(x,y\)均\(<=\)任何一个黑点的\(x,y\),否则这个黑点就会包含在这个白点构成的矩形中。

将所有点按照行优先,行列均从小到大排序。这样就已经钦定好了\(x\)的顺序,接下来只需要考虑\(y\)的合法性即可。对于当前所有枚举的白色格子,维护它们的\(miny\),则在之后枚举的所有黑色格子中,它的\(y\)不能超过当前的\(miny\),否则这个黑色格子就一定包括在了某个白色矩形内,一定不合法。

code

E

暴搜,但有一个小坑点。

题意开门见山,\(C(n,k) <= 10^6\),直接告诉你了暴搜就行。但是复杂度并不只是\(O(C(n,k))\),而是\(O(k*C(n,k))\)。

因为对于每一个方案,\(dfs\)递归函数就已经递归了\(k\)层。所以对于每一种枚举方案,都要递归\(k\)层。所以复杂度要多乘一个\(k\)。

由于\(C(n,k)\)很小的时候,\(n\)和\(k\)一定非常接近。所以要么\(k\)很小,要么\(n-k\)很小。故:

  1. 当\(k\)很小时,直接暴搜就行了。
  2. 当\(n-k\)很小时,考虑枚举不选的数,这样枚举的数量仍然很小,可以得到所有不选的数的异或和。最后所有选的数的异或和可以用 所有数的异或和 ^ 所有不选的数的异或和 来得到。、

虽然这道题出在E很奇怪,但也让我对暴搜的复杂度有了更深一步的理解,还是有所收获的。

code

F

字符串编辑距离\(dp\)的魔改

首先考虑朴素的字符串编辑距离:

给定两个字符串,每次可使用三种操作中的一种:

1. 在S任意位置添加一个字符

2. 删除S任意一个字符

3. 将S某个字符修改为任意字符

\(dp[i][j]\) : 将\(S[1到i]\)变为\(T[1到j]\),需要的最小操作数

\(init\):\(dp[0][0] = 0\) , $dp[i][j] = ∞ $ ,\(ans = dp[n][m]\)

转移:

dp[i][j] = min(dp[i][j] , dp[i - 1][j] + 1);// 删除S[i]
dp[i][j] = min(dp[i][j] , dp[i][j - 1] + 1);// 在S末尾添加T[j]
dp[i][j] = min(dp[i][j] , dp[i - 1][j - 1] + (S[i] != T[j]));// 将S[i]修改为T[j],若本来就相同则不用修改

时间复杂度为\(O(nm)\),当两个字符串长均为\(10^5\)级别时必然TLE。考虑优化:

由于可操作次数\(k\)非常小,最多才\(20\)。所以对于任意\(S\)与\(T\)的前缀,若二者的长度差绝对值超过了\(k\),就不需要再计算对应的\(dp\)值了,因为必然要进行超过\(k\)次的插入或者删除,一定不合法。

所以,只需要枚举S的前缀,然后从\(S[i]\)出发,只转移向左或向右走\(k\)步以内的状态就行了,时间复杂度\(O(nk)\)。

更改\(dp\)数组的定义:\(dp[i][dj]\)表示将\(S[1到i]\)变成\(T[1到i-dj]\),需要的最小操作数,即第二维表示T结尾相对于S结尾的偏移量,范围\([-k,k]\),负数偏左,正数偏右。

状态转移:见AC代码。尤其要注意\(dp\)数组第二维的下标是怎样变化的,需要考虑S与T结尾的相对位置差距。

由于数组下标不能是负数,所以对第二维整体加个\(k\),这样就避免了下标为负数了。

同时要注意在字符串\(dp\)中,空串是一个很重要的概念,是\(dp\)数组最开始转移的基础,空串也要参与转移。

总的来说,这不是一道难题,甚至可以说是一道典题。但补题还是补了很长时间,还是太菜了。。

code

ABC 386 (A~F)的更多相关文章

  1. 【图论好题】ABC #142 Task F Pure

    题目大意 给定一个 $N$ 个点 $M$ 条边的有向图 $G$,无重边.自环.找出图 $G$ 的一个导出子图(induced subgraph) $G'$,且 $G'$ 中的每个点的入度和出度都是 1 ...

  2. Keras入门——(5)长短期记忆网络LSTM(二)

    参考: https://blog.csdn.net/zwqjoy/article/details/80493341 https://blog.csdn.net/u012735708/article/d ...

  3. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  4. C#中将DataTable导出为HTML的方法

    今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...

  5. Lua的string和string库总结

    Lua有7种数据类型,分别是nil.boolean.number.string.table.function.userdata.这里我总结一下Lua的string类型和string库,复习一下,以便加 ...

  6. ECMAScript

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  7. MVC 从后台页面 取前台页面传递过来的值的几种取法

      MVC 从后台页面 取前台页面传递过来的值的几种取法   <1>前台页面 Index视图 注意:用户名表单的name值为txtName 密码表单的name值为txtPassword & ...

  8. Matlab编程基础

    平台:Win7 64 bit,Matlab R2014a(8.3) “Matlab”是“Matrix Laboratory” 的缩写,中文“矩阵实验室”,是强大的数学工具.本文侧重于Matlab的编程 ...

  9. 巧用vsprintf将浮点数等转化字符串

    直接上代码 #include <stdarg.h> ]; int vspf(char *fmt, ...) { va_list argptr; int cnt; va_start(argp ...

  10. LDAP与migrationtools 导入系统账号

    1:安装migrationtools yum -y install migrationtools 2:修改配置文件 cd     /usr/share/migrationtools 可以看到很多的文件 ...

随机推荐

  1. 在Windows环境下使用AMD显卡运行Stable Diffusion

    现在用的电脑是 21 年配的,当时并没有 AI 相关的需求,各种各样的原因吧,抉择后选择了 AMD 的显卡,但在 2024 年的今天,使用 AI 进行一些工作已不再是什么罕见的需求,所以我也想尝试一下 ...

  2. .NET Core 委托底层原理浅谈

    简介 .NET通过委托来提供回调函数机制,与C/C++不同的是,委托确保回调是类型安全,且允许多播委托.并支持调用静态/实例方法. 简单来说,C++的函数指针有如下功能限制,委托作为C#中的上位替代, ...

  3. HTTP相关返回值异常如何解决(上篇)

    ​ 今天我们讲讲HTTP相关返回值异常如何解决(实例持续更新中) 一.HTTP介绍 HTTP(超文本传输协议,Hypertext Transfer Protocol)是用于在网络上进行数据交换的应用层 ...

  4. 告别繁琐的云平台开发!IoT_CLOUD之【百度云】

    ​ 众所周知,市面上有很多云平台,阿里云.腾讯云.中移OneNET.华为云.百度云.涂鸦云.Tlink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对 ...

  5. win11 与VMware pro16不兼容或者是不能嵌套虚拟或者此平台不支持虚拟化的Intel VT-x/EPT等问题

    如遇 不用去掉啥windows沙盒,不用关掉什么Hyper-V. 可以在window11的应用里面的可选功能把虚拟平台的勾去掉然后重启一下 而虚拟机不在配置处理器的时候不勾选下图这个 就会出现这种情况 ...

  6. php的各种序列化对比

    php的各个序列化反序列化对比如下 function 10万条记录的序列化并写入(ms) 10万条记录文件读取并反序列化(ms) 100条记录序列化并写入(ms) 100条记录文件读取并反序列化(ms ...

  7. 使用免费的SVN服务器

    在本地环境中安装SVN window版本自行搜索图文教程. linux版本(以我的 ubuntu 为例子) 我尝试直接敲SVN svn 报错 Command 'svn' not found, but ...

  8. 鸿蒙NEXT开发案例:亲戚关系计算器

    [引言] 在快节奏的现代生活中,人们往往因为忙碌而忽略了与亲戚间的互动,特别是在春节期间,面对众多的长辈和晚辈时,很多人会感到困惑,不知道该如何正确地称呼每一位亲戚.针对这一问题,我们开发了一款基于鸿 ...

  9. 使用SharpCompress压缩,tar.gz

    之前我们介绍了如何用SharpZipLib来打.tar.gz压缩包. 但是这个压缩软件有两个问题,一是代码比较多,压缩起来没有那么方便:二是压缩的.tar.gz在linux上解压时会有警告,需要跳过这 ...

  10. linux 安装 docker

    1.安装 yum-utils yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 --skip-broken 执行如果 报错 ...