[ARC177F] Two Airlines

news/2024/11/16 20:47:15/文章来源:https://www.cnblogs.com/WrongAnswer90/p/18377096

My Blogs

[ARC177F] Two Airlines

有点魔怔的题。

一个基本的观察是如果当前某个人 \(A\) 拿着盒子走到了位置 \(i\),那位置小于 \(i\) 的人一定永远没用了。如果之后要用到前面的人 \(B\),就应当让 \(B\) 拿着盒子走到 \(i\) 而不是让 \(A\),这样 \(A\) 待在原来的位置,代价一定不会更劣。

再手玩一下,可以发现每次的过程都是:某个人 \(A\) 拿起盒子,走到某个地方。然后后面来了一个和 \(A\) 颜色不一样的人(或者是本身就在这个地方的人),走到了 \(A\) 现在的位置,然后带着箱子走了,此时 \(A\) 也已经没有用了。

进一步的,“后面来人”的这个过程,对于每种颜色内部,一定是先用坐标尽量小的人来。这个结论不难用调整法证明。

而最优解一定能用上述过程刻画出来。所以可以设 \(f_{i,j,k,0/1}\) 表示当前盒子在 \(i\),被 \(0/1\) 颜色的人拿着,\(i\) 后面的 \(j\) 个颜色为 \(0\) 的人已经用过了(此时在 \(<i\) 的位置),\(k\) 个颜色为 \(1\) 的人已经用过了。转移 \(\mathcal O(1)\),状态数和复杂度都是 \(\mathcal O(n^3)\) 的。

接下来的一个想法观察性质,能不能简化一维状态什么的,但是好像不太好做。除此之外比较自然地,可以感受到 \(j,k\) 都不会太大,设成 \(20\) 左右,交上去就直接过了。下面证明 \(j,k\) 都只需要取到 \(\log n\)

直观感受一下,“后面来人”的原因一定是,\(i\) 后面有一段比较长的和当前拿着箱子的颜色不同的路。

image.png

红色和蓝色的块分别表示序列上红色和蓝色的连续位置。红色段里面不一定全部都是红色,蓝色段里也不一定全是蓝色。红色和蓝色的线条表示人走过的路程。\(a_i\) 表示这个蓝色段里面有多少个蓝色格子。

称除去搬运盒子过程中造成的代价为“额外代价”。因为第二条红色线条走到他的目标位置(第二个红块)额外花费了 \(\sum_{j\geq 2}a_j\) 的代价,所以 \(a_1>\sum_{j\geq 2}a_j\),否则可以让第一个人直接走到第二个红色段:

image.png

这样一定不劣。后面的同理,\(a_i>\sum_{j>i}a_j\),所以最多 \(\log\) 轮之后 \(a_i\) 就要超出值域了。所以 \(j,k\) 的维度都只需要开到 \(20\)。预处理一下还是能做到 \(\mathcal O(1)\) 转移。总复杂度 \(\mathcal O(n\log^2 n)\)

int n,m,f[60010][21][21][2],nex[2][60010][21],t[60010][2],a[60010][2];
char s[60010];
vi ve[2];
inline void mian()
{read(n,m),read(s);int x,ans=INF;char ch;while(m--)read(x),read(ch),t[x][ch=='A']++,ve[ch=='A'].eb(x);for(int i=1;i<=n;++i)a[i][0]=a[i-1][0],a[i][1]=a[i-1][1],++a[i][s[i]=='A'];sort(ve[0].begin(),ve[0].end()),sort(ve[1].begin(),ve[1].end());for(int k=0;k<2;++k)for(int i=0;i<=n;++i){int p=lower_bound(ve[k].begin(),ve[k].end(),i)-ve[k].begin();for(int j=1;j<=20;++j)if(p+j-1<(int)ve[k].size())nex[k][i][j]=ve[k][p+j-1];else nex[k][i][j]=-1;}memset(f,127,sizeof(f));if(nex[0][0][1]!=-1)f[0][1][0][0]=a[nex[0][0][1]][1];if(nex[1][0][1]!=-1)f[0][0][1][1]=a[nex[1][0][1]][0];for(int i=0;i<n;++i){for(int j=0;j<=20;++j)for(int k=0;k<=20;++k){if(j<20&&nex[0][i][j+1]!=-1)Mmin(f[i][j+1][k][0],f[i][j][k][1]+a[nex[0][i][j+1]][1]-a[i][1]);if(k<20&&nex[1][i][k+1]!=-1)Mmin(f[i][j][k+1][1],f[i][j][k][0]+a[nex[1][i][k+1]][0]-a[i][0]);}for(int j=0;j<=20;++j)for(int k=0;k<=20;++k)for(int l=0;l<2;++l)Mmin(f[i+1][max(0ll,j-t[i][0])][max(0ll,k-t[i][1])][l],f[i][j][k][l]+(l!=(s[i+1]=='A')));}for(int i=0;i<=20;++i)for(int j=0;j<=20;++j)for(int k=0;k<2;++k)Mmin(ans,f[n][i][j][k]);write(ans);
}

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

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

相关文章

helm原理及实践

目录为什么用HelmHelm是什么简介设计目标架构核心概念如何使用客户端命令使用 为什么用Helm 它使Kubernetes应用程序的配置、部署和维护变得更加简单、可控和可重复。优势 描述模板化配置 Helm 将应用程序的配置参数化,并使用模板引擎将这些参数嵌入到配置文件中。这使得配置更…

SAP S4HANA 2023 FPS01 FAA虚拟机发布了

SAP S4HANA 2023 FPS01 FAA虚拟机发布了。 系统不再需要修改虚拟机日期了,提供最高长达三年的许可,业务财务做账都是真实的时间!该虚拟机版本优点: 新版的一键启动脚本,3分钟就能启动完成。内存加载 80GB 就可以启动所有服务。不需要修改虚拟机日期,完美支持业务操作和财…

k8s介绍-英文版

目录WhyWhatSynopsisDesign GoalsArchitectureimage1image2image3Main ComponetsCore Resoucessome core resoucesrelated cmdsHowImplementation MechanismData Flow Why We need a set of tools and technologies designed to efficiently deploy, manage, and orchestrate c…

线段树(2)——懒惰标记Lazy Tag(单运算)及例题

上一篇文章我们讲了线段树的最基本的操作。如果有一种操作叫做区间加法呢?这个时候显然可以依次单点修改,但是时间复杂度太高了。所以可以考虑优化,由于思考过程可能很长,此处直接引入懒惰标记。 懒惰标记就是在对一颗树的所有节点进行某种统一操作时,只对根节点做一个标记…

Python保存数据为xlsx格式

参考代码 运行下面的代码,首先要安装下面这两个库:pandas openpyxlimport pandas as pd processed_data = [{"日期":"20230809","品牌":"Apple"},{"日期":"20230422","品牌":"Huawei"}, ] …

[思考] Diffusion Model

时间线 以下是一些重要的里程碑,它们代表了基于Diffusion的图像生成方法的发展:时间&机构 名称 简述- VAE Variational AutoEncoder,变分自编码器用于图像生成2020.12 VQ-VAE Vector Quantized-Variational AutoEncoder,一种用于生成模型的量化技术2020.12 VQ-GAN Vect…

如何正确使用搜索引擎(屏蔽csdn)

浏览器星愿浏览器 我使用的是星愿浏览器,推荐使用,其中有个性化的设置和搜索引擎的优化辅助,搜索引擎我选择的有:百度 必应 谷歌 DuckDuckGo 检索过程中想要快速切换各种搜索引擎,星愿浏览器有提供辅助拓展插件这里主要推荐每氪净化,可以自动添加屏蔽,例如CSDN搜索后结果…

Pollard Rho 算法

Pollard Rho 算法 难评,看OI-WIKI吧。 引入 Pollard Rho 算法用于求快速找到一个正整数 \(n\) 的一个非平凡因数[1]。 生日悖论不考虑出生年份(假设每年都是365天),问:一个房间中至少多少人,才能使其中两个人生日相通的概率达到 \(50\%\)?解:假设一年有 \(n\) 天,房间…

史上最牛的 权限系统,如何设计? 来了一个 Sa-Token学习圣经

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

POLIR-政治-真实社政: 理论与事实的统一与颠倒 : “改革”与“政治民主+经济市场” VS 特权集团为“既得利益”以“集权和垄断”的“假改革”忽悠人

改革有两个永恒的目标:经济的市场化 和 政治的民主化。 特权阶层和既得利益者, 为了“保住特权和既得利益”会拼力地“反对这两个目标“, 他们用“集权和垄断”的“假改革”来忽悠人们,实际上是开历史倒车。吴敬琏(经济学家)

软件工程进度报告——第八周

本周尝试练习了飞机购票问题样例1样例2