[IOI2000] 邮局 P10967/P4767/P6246

news/2025/1/15 13:50:22/文章来源:https://www.cnblogs.com/SFlyer/p/18406320

P10967

设在 \(1\sim i\) 装了 \(j\) 个邮局的答案 \(f_{i,j}\)\(f_{i,j}=\min\{f_{k,j-1}+w_{k+1,i}\}\),其中 \(w_{l,r}\)\(l\sim r\) 有一个邮局的最小距离。

  • \(w_{l,r}\) 怎么求?在中位点装邮局。那么有 \(w_{l,r}=w_{l,r-1}+x_j-x_{[(i+j)/2]}\)。其中 \(x\) 是村庄位置。进一步有 \(\mathcal{O}(1)\) 算法,\(m=[(l+r)/2],w_{l,r}=x_{m}\times (2m-l-r-1)+sum_{l+1}+sum_r-2sum_m\)。所以这个不是复杂度瓶颈。

得到了一个 \(\mathcal{O}(v^2p)\) 的算法。

P4767

\(f_{i,j}=\min\{f_{k,j-1}+w_{k+1,i}\}\) 这个方程内,状态较难优化,所以尝试优化转移。

证:\(w_{l,r}\) 符合 \(Q.I.\)

\(w_{i,j}+w_{i',j'}\le \sum_{l=i}^j |d_l-d_z|+\sum_{l=i'}^{j'}|d_l-d_y|\)

\(\le \sum_{l=i}^j |d_l-d_z|+\sum_{l=i'}^{j'}|d_l-d_y|+\sum_{l=j+1}^{j'}|d_l-d_z|-\sum_{l=j+1}^{j'}|d_l-d_y|\)

\(=\sum_{l=i}^{j'}|d_l-d_z|+\sum_{l=i'}^j |d_l-d_y|=w(i,j')+w(i',j)\)

\(m_{i,j}\)\(f_{i,j}\) 最小决策点。

引理 \(1\)\(m_{i+1,j}\ge m_{i,j}\)

引理 \(2\)\(m_{i,j-1}\le m_{i,j}\)

计算 \(m_{i,j-1}\le k\le m_{i+1,j}\)。从小到大枚举 \(j\),从大到小枚举 \(i\) 即可。

时间复杂度 \(\mathcal{O}(pv)\)

P6246

尝试优化状态!这个“邮局数量”状态让人联想起 wqs 二分。

或者感性理解:如果每建立一个邮局有一个附加的费用,费用越高你想要建立的邮局数量就会减少。所以是一个上凸包。

二分 \(mid\) 费用,就变成了:\(f_{i}=\min\{f_{k}+w_{k+1,i}+mid\}\)。这个是 1D-1D dp 方程。

\(f(i)=\min_{0\le j<i} f(j)+w(j,i)\)。(注意是 \(\min\)!)组数没有限制的分组问题。

定理:若 \(w\) 符合 \(Q.I.\),当 \(d\ge c\) 时,\(f(d)\) 的最优决策点 \(\ge f(c)\) 最优决策点。

因此:对于每个已经计算出来的 \(f_i\),去寻找它能更新的状态有哪些。在栈顶的决策起始位置判断起始位置是否决策 \(i\) 更优。如果是,则退栈,继续执行,否则,二分决策位置。

最终代码:

#include <bits/stdc++.h>using namespace std;using ll = long long;const int N = 5e5+5;struct node {ll l,r,x;
} stk[N];ll n,m,a[N],sum[N],dp[N],top,cnt[N];ll w(ll l,ll r){ll mid=(l+r+1)/2;return a[mid]*(mid+mid-l-r)+sum[l]+sum[r]-sum[mid]*2; 
}int ff(int i){int l=stk[top].l-1,r=stk[top].r+1;while (l+1<r){int mid=l+r>>1;if (dp[i]+w(i,mid)<=dp[stk[top].x]+w(stk[top].x,mid)){r=mid;}else{l=mid;}}return r;
}bool chk(ll x){top=1;stk[1]={1,n,0};for (int i=1,cur=1; i<=n; i++){dp[i]=dp[stk[cur].x]+w(stk[cur].x,i)+x;cnt[i]=cnt[stk[cur].x]+1;while (i<stk[top].l && dp[i]+w(i,stk[top].l)<=dp[stk[top].x]+w(stk[top].x,stk[top].l)){top--;}int pos=ff(i);stk[top].r=pos-1;if (pos<=n){stk[++top]={pos,n,i};}if (i==stk[cur].r){cur++;}}return cnt[n]>=m;
}int main(){ios::sync_with_stdio(false);cin.tie(0);cin>>n>>m;for (int i=1; i<=n; i++){cin>>a[i];sum[i]=sum[i-1]+a[i];}ll l=-1,r=1e9;r++;while (l+1<r){ll mid=l+r>>1;if (chk(mid)){l=mid;}else{r=mid;}}chk(l);cout<<dp[n]-l*m<<"\n";return 0;
}

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

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

相关文章

推荐一款好用的golang修复无效json的库:JSONRepair

简单来说,就是可以将错误格式(非标准)的json修正,如下图所示: 我的json明显不是标准的json格式,是不能被解析的: 但是JSONRepair库也能修复。github地址:https://github.com/kaptinlin/jsonrepair 使用也非常简单: 1、安装:go get github.com/kaptinlin/jsonrepair2、…

全志T507-H国产平台Ubuntu系统正式发布,让您的应用开发更便捷!

为了满足广大工业用户的需求,创龙科技针对全志T507-H工业平台进行了Ubuntu系统适配,开发环境如下: Ubuntu:Ubuntu18.04.4 U-Boot:U-Boot-2018.05 Kernel:Linux-4.9.170、Linux-RT-4.9.170 LinuxSDK:LinuxSDK-[版本号].tar.gz (基于全志官方V2.0_20220618)全志T507-H国…

IEC103设备数据 转 IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集103设备数是 2 5 用IEC61850协议转发数据 4 6 网关使用多个逻辑设备和逻辑节点的方法 6 7 IEC103协议说明 8 8 案例总结 9 1 案例说明设置网关采集IEC103设备数据 把采集的数据转成IEC61850协议转发给…

【触想智能】工业一体机在物流领域上的四大应用分析

随着物流业的快速发展,工业一体机在物流领域上的应用越来越普遍。工业一体机是一种高级智能设备,是多种技术的综合应用,包括机械、电子、计算机、通讯等。在物流行业中,工业一体机可以发挥其先进的技术和功能,提高物流的效率和质量。本文将探讨工业一体机在物流领域上的应…

使用 nuxi upgrade 升级现有nuxt项目版本

title: 使用 nuxi upgrade 升级现有nuxt项目版本 date: 2024/9/10 updated: 2024/9/10 author: cmdragon excerpt: 摘要:本文介绍了如何使用nuxi upgrade命令升级Nuxt 3项目,包括打开终端、运行升级命令、使用选项、测试项目等步骤,以及升级前的注意事项,如备份代码、检查…

[MySQL]为什么主键最好是有序递增的

为什么主键索引最好是有序递增的我们在建表的时候,都会默认将主键索引设置为自增的,具体为什么要这样做呢?又什么好处? InnoDB 创建主键索引默认为聚簇索引,数据被存放在了 B+Tree 的叶子节点上。也就是说,同一个叶子节点内的各个数据是按主键顺序存放的,因此,每当有一…

Oracle 19c OCP 认证考试 082 题库(第18题)- 2024年修正版

【优技教育】Oracle 19c OCP 082题库(Q 18题)- 2024年修正版 考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为(CUUG 原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。 原文地址:http://www.cuug.com.cn/ocp/082kaoshitiku/3821954095…

盘点一个Python自动化办公实战问题

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【上海新年人】问了一个Python自动化办公实战的问题,问题如下:大佬们,我有个难度高的问题,我有个文件夹,里面呢有一堆文件,然后我要寻找至少2个关键字相同的文件,然后提取文件中第二列中的数字,第一列名称…

路由相关

路由分发研究django admin源码时:namespace是什么?无namespace from django.urls import reverseurl = reverse("v2") print(url)有namespace from django.urls import reverseurl = reverse("namespace名称:v2") print(url)url = reverse("namespa…

CS上线Linux

CS上线Linux下载和配置crossC2首先到项目地址:https://github.com/gloxec/CrossC2/releases下载两个文件 ​​‍.cna是CS的插件,直接使用CS导入即可 ​​ 创建HTTPS监听器似乎Linux的shell目前只支持https​,所以创建HTTPS监听器 ​​ 生成Linux终端的shell木马 第一种 ./ge…