[IOI2000] 邮局 加强版 题解

考虑动态规划,设 \(f_{i,j}\) 为经过了 \(i\) 个村庄,正在建第 \(j\)​ 个邮局的最优距离。

以及 \(w_{i,j}\) 表示区间 \([i,j]\)​ 内建一个邮局时的距离总和。

\(a\) 数组表示每个村庄的坐标编号。

朴素版状态转移方程:

\[f_{i,j}=\min(f_{i,j},f_{k,j-1}+w_{k+1,i})
\\ \\
k\in [0,i)
\]

根据初一上册数学,可知在区间 \([x,y]\) 中距离所有点的距离之和最短的点为:

若 \(2\mid x+y\),则点位于 \(\lfloor\frac{x+y}{2}\rfloor\)。

反之位于 \(\lfloor\frac{x+y+1}{2}\rfloor\)。

注意到,上述状态转移方程,有三个未知数:\(i,j,k\)。可得时间复杂度为 \(O(PV^3)\),肯定过不了。

考虑四边形不等式优化

注意到,\(w\)​ 函数的状态转移方程为:

\[w_{l,r+1}=w_{l,r}+a_{r+1}-a_{\lfloor\frac{l+r+1}{2}\rfloor}
\]

需要简化,过程如下,虽复杂,但重要,可加以理解。

\[\begin{cases}w_{l,r+1}=w_{l+r}+a_{r+1}-a_{\lfloor\frac{l+r+1}{2}\rfloor} \ 1式
\\
w_{l+1,r+1}=w_{l+1,r}+a_{r+1}-a_{\lfloor\frac{l+r+2}{2}\rfloor}\ 2式
\end{cases}
\\
\]

2式 \(-\) 1式,得:

\[w_{l+1,r+1}-w_{l,r+1}=w_{l+1,r}+a_{r+1}-a_{\lfloor\frac{l+r+2}{2}\rfloor}
-w_{l,r}-a_{r+1}+a_{\lfloor\frac{l+r+1}{2}\rfloor}\\
w_{l+1,r+1}-w_{l,r+1}=w_{l+1,r}-w_{l,r}+a_{\lfloor\frac{l+r+1}{2}\rfloor}
-a_{\lfloor\frac{l+r+2}{2}\rfloor}\\
w_{l+1,r+1}-w_{l,r+1}-w_{l+1,r}+w_{l,r}=a_{\lfloor\frac{l+r+1}{2}\rfloor}
-a_{\lfloor\frac{l+r+2}{2}\rfloor}
\]

\(\because\) 坐标单调上升

\[\therefore\ a_{\lfloor\frac{l+r+1}{2}\rfloor}\ \le \ a_{\lfloor\frac{l+r+2}{2}\rfloor}\\
\therefore\
a_{\lfloor\frac{l+r+1}{2}\rfloor}-a_{\lfloor\frac{l+r+2}{2}\rfloor}\le 0\\
w_{l+1,r+1}-w_{l,r+1}-w_{l+1,r}+w_{l,r}\le 0\\
w_{l,r}+w_{l+1,r+1}\le w_{l,r+1}+w_{l,r+1}\\
w_{l,r+1}+w_{l+1,r}\ge w_{l,r}+w_{l+1,r+1}
\]

通过四边形不等式可知,若 \(a,b,c,d\) 满足 \(a\le b \le c \le d\),且 \(w_{a,c}+w_{b,d}\le w_{a,d}+w_{b,d}\),则称 \(w\) 为四边形不等式,可以优化时间复杂度。

\(\because l\le l+1 \le r \le r+1\),则可以将 \(a,b,c,d\)​ 分别带入进去,即:

当 \(a=l,b=l+1,c=r,d=r+1\) 时:

\[w_{l,r+1}+w_{l+1,r}\ge w_{l,r}+w_{l+1,r+1}\\
w_{a,c}+w_{b,d}\ge w_{a,d}+w_{b,d}
\]

再附上1式 \(-\) 2式的:

\[w_{l,r+1}-w_{l+1,r+1}=w_{l,r}-a_{r+1}-a_{\lfloor\frac{l+r+1}{2}\rfloor}
-w_{l+1,r}+a_{r+1}+a_{\lfloor\frac{l+r+2}{2}\rfloor}
\\ \\
w_{l,r+1}-w_{l+1,r+1}=w_{l,r}-a_{\lfloor\frac{l+r+1}{2}\rfloor}-w_{l+1,r}+a_{\lfloor\frac{l+r+2}{2}\rfloor}
\\ \\
w_{l,r+1}-w_{l+1,r+1}-w_{l,r}+w_{l+1,r}=a_{\lfloor\frac{l+r+2}{2}\rfloor}
-a_{\lfloor\frac{l+r+1}{2}\rfloor}
\]

\(\because\) 坐标单调上升

\[\therefore a_{\lfloor\frac{l+r+2}{2}\rfloor}\ge a_{\lfloor\frac{l+r+1}{2}\rfloor}\\
a_{\lfloor\frac{l+r+2}{2}\rfloor}-a_{\lfloor\frac{l+r+1}{2}\rfloor}
\ge 0\\
w_{l,r+1}+w_{l+1,r}-w_{l+1,r+1}-w_{l,r}\ge 0
\\
w_{l,r+1}+w_{l+1,r} \ge w_{l+1,r+1}+w_{l,r}
\]

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXV=3003,MAXP=305,inf=1e9+5;
int v,p;
int f[MAXV][MAXP];//经过了i个村庄,正在建j个邮局
int a[MAXV],w[MAXV][MAXV],dp[MAXV][MAXP];
int minn,minid;
signed main(){
scanf("%d%d",&v,&p);
for(int i=1;i<=v;i++)
scanf("%d",&a[i]);
sort(a+1,a+v+1);
memset(f,0x3f,sizeof(f));
f[0][0]=0;
for(int i=1;i<=v;i++)
for(int j=i+1;j<=v;j++)
w[i][j]=w[i][j-1]+a[j]-a[i+j>>1];
for(int j=1;j<=p;j++)
{
dp[v+1][j]=v;
for(int i=v;i>=1;i--)
{
minn=inf;
for(int k=dp[i][j-1];k<=dp[i+1][j];k++)
{
if(f[k][j-1]+w[k+1][i]<minn)
{
minn=f[k][j-1]+w[k+1][i];
minid=k;
}
}
f[i][j]=minn;
dp[i][j]=minid;
}
}
printf("%d\n",f[v][p]);
return 0;
}

IOI2000 邮局 加强版 题解的更多相关文章

  1. BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探

    貌似$BZOJ$上并没有这个题... 是嫌这个题水了么... 还是要氪金权限号??? 这里附上洛谷的题面:洛谷P4767 [IOI2000]邮局 题目描述 高速公路旁边有一些村庄.高速公路表示为整数轴 ...

  2. 1473. [Ioi2000]Post加强版 n log^2 n做法

    1473. [Ioi2000]Post加强版 n log^2 n做法 题面 有n个城市从负方向向正方向按照1至n标号,\(d[i]\)表示城市i离原点的距离并且\(d[1] = 0\),对于\(i \ ...

  3. COGS 1507. [IOI2000]邮局

    1507. [IOI2000]邮局 ★☆   输入文件:postoffice.in   输出文件:postoffice.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] ...

  4. 题解——洛谷P4767 [IOI2000]邮局(区间DP)

    这题是一道区间DP 思维难度主要集中在如何预处理距离上 由生活经验得,邮局放在中间显然最优 所以我们可以递推求出\( w[i][j] \)表示i,j之间放一个邮局得距离 然后设出状态转移方程 设\( ...

  5. 邮局加强版:四边形不等式优化DP

    题目描述 一些村庄建在一条笔直的高速公路边上,我们用一条坐标轴来描述这条公路,每个村庄的坐标都是整数,没有两个村庄的坐标相同.两个村庄的距离定义为坐标之差的绝对值.我们需要在某些村庄建立邮局.使每个村 ...

  6. P4767 [IOI2000]邮局 - 平行四边形不等式优化DP

    There is a straight highway with villages alongside the highway. The highway is represented as an in ...

  7. [IOI2000] 邮局

    ## 非常神仙的 wqs 二分优化dp,又学了一招. 首先我们需要先想到一个人类智慧版的前缀和优化. # part 1:violence 然鹅在前缀和优化之前我们先考虑暴力做法:我们可以枚举 i . ...

  8. [LUOGU] P4767 [IOI2000]邮局

    https://www.luogu.org/problemnew/show/P4767 四边形不等式好题! 可以设f[i][j]表示前i个村庄,建了j个邮局的最小代价. 转移:f[i][j]=min{ ...

  9. luogu_P4767 [IOI2000]邮局

    传送门 Description 高速公路旁边有一些村庄.高速公路表示为整数轴,每个村庄的位置用单个整数坐标标识.没有两个在同样地方的村庄.两个位置之间的距离是其整数坐标差的绝对值. 邮局将建在一些,但 ...

  10. GERALD07加强版题解

    题目描述: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 输入格式: 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来M行,代表图 ...

随机推荐

  1. Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

    扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 useHead 函数概述 useHead是一个用于在 Nuxt 应用中自定义页面头部属性的函数.它由Unhead库提供支持,允许开发者以编 ...

  2. manim边学边做--Matrix

    在代数问题中,矩阵是必不可少的工具,manim中提供了一套展示矩阵(Matrix)的模块,专门用于在动画中显示矩阵格式的数据.关于矩阵的类主要有4个: Matrix:通用的矩阵 IntegerMatr ...

  3. oeasy教您玩转python - 003 - # - 继续运行

    ​ 继续运行 回忆上次内容 在解释器里玩耍 print("Hello World") 1+1 编写了 py 文件 运行了 py 文件 这次我们继续丰富这个文件 分析 py 文件 我 ...

  4. Python爬虫(1-4)-基本概念、六个读取方法、下载(源代码、图片、视频 )、user-agent反爬

    Python爬虫 一.爬虫相关概念介绍 1.什么是互联网爬虫 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据 解 ...

  5. 开源!开源一个flutter实现的古诗拼图游戏

    去年(2023年)年底我初学flutter,看了一些文档和教程,想找个东西*练练手. 小时候看过一个关于历史名人儿时事迹的短片,有一集是讲*总理的,有一个细节我记得很清楚:幼年***经常要做一个游戏- ...

  6. R语言基于表格文件的数据绘制具有多个系列的柱状图与直方图

      本文介绍基于R语言中的readxl包与ggplot2包,读取Excel表格文件数据,并绘制具有多个系列的柱状图.条形图的方法.   首先,我们配置一下所需用到的R语言readxl包与ggplot2 ...

  7. 【Hibernate】Re01 快速入门

    官网地址: http://hibernate.org/orm/releases/5.4/ 地址: https://bintray.com/hibernate/artifacts/hibernate-o ...

  8. Git 学习笔记——git checkout

    上图是我对git常用用法的一个总结,今天这里主要解释上面操作中没有的 " git checkout "操作. =================================== ...

  9. 利用 Amazon EMR Serverless、Amazon Athena、Apache Dolphinscheduler 以及本地 TiDB 和 HDFS 在混合部署环境中构建无服务器数据仓库(一)云上云下数据同步方案设计

    引言 在数据驱动的世界中,企业正在寻求可靠且高性能的解决方案来管理其不断增长的数据需求.本系列博客从一个重视数据安全和合规性的 B2C 金融科技客户的角度来讨论云上云下混合部署的情况下如何利用亚马逊云 ...

  10. 白鲸开源CEO郭炜荣获「2024中国数智化转型升级先锋人物」称号

    2024年7月24日,由数据猿主办,IDC协办,新华社中国经济信息社.上海大数据联盟.上海市数商协会.上海超级计算中心作为支持单位,举办"数智新质·力拓未来 2024企业数智化转型升级发展论 ...