首页 > 其他分享 >[IOI2000]邮局 题解

[IOI2000]邮局 题解

时间:2023-01-10 16:34:45浏览次数:45  
标签:frac leq IOI2000 题解 邮局 村庄 text dp

简要题意

线段上有 \(V\) 个村庄,现在要建 \(P\) 个邮局,使每个村庄到最近的邮局的距离之和最小。

50分做法

设\(dp[i][j]\) 表示第一个村庄到第 \(i\) 个村庄,建了 \(j\) 个邮局的最小距离,不难得出状态转移方程:
\(dp[i][j]=min(dp[k][j-1]+w[k+1][i])\),
其中 \(w[i][j]\) 表示在第 \(i\) 和 \(j\) 个村庄之间建一个邮局的最短总距离。
根据初中知识不难求得,邮局建在第 \(i\) 到 \(j\) 个村庄的中位数的位置上(奇数个村庄)或第 \(i\) 到 \(j\) 个村庄的两个中位数之间(偶数个村庄),则总距离最短,因此我们可以递推求出 \(w[i][j]\),\(w[i][j]=\begin{cases} & 0\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ } i=j \\ & w[i][j-1]+v[j]-v[(i+j)/2] \text{ }\text{ }\text{ }\text{ }\text{ }i<j\end{cases} \text{ }\) ,其中 \(v[i]\) 表示第 \(i\) 个村庄的位置。

证明:

当第 \(i\) 到 \(j\) 个村庄为奇数个时,第 \(i\) 到 \(j-1\) 个村庄为偶数个,第 \(i\) 到 \(j-1\) 个村庄的中位数为第 \(\left \lfloor \frac{(i+j-1)}{2} \right \rfloor\) 个村庄和第 \(\left \lceil \frac{(i+j-1)}{2} \right \rceil\) 个村庄,第 \(i\) 到 \(j\) 个村庄的中位数为第 \(\frac{(i+j)}{2}\) 即 \(\left \lceil \frac{(i+j-1)}{2} \right \rceil\) 个村庄;
当第 \(i\) 到 \(j\) 个村庄为偶数个时,第 \(i\) 到 \(j-1\) 个村庄为奇数个,第 \(i\) 到 \(j-1\) 个村庄的中位数为第 \(\frac{(i+j-1)}{2}\) 个村庄,第 \(i\) 到 \(j\) 个村庄的中位数为第 \(\left \lfloor \frac{(i+j)}{2} \right \rfloor\) 即 \(\frac{(i+j-1)}{2}\) 个村庄和第 \(\left \lceil \frac{(i+j)}{2} \right \rceil\) 个村庄;
此时第 \(i\) 到 \(j-1\) 个村庄到邮局的距离之和不变,第 \(j\) 个村庄到邮局的距离即第 \(j\) 个村庄到第 \(i\) 到 \(j\) 个村庄的中位数的距离,即第 \(j\) 个村庄的位置减去第 \(i\) 到 \(j\) 个村庄的中位数的位置。

预处理 \(w[i][j]\) 之后,我们可以三层循环分别枚举 \(i,j,k\),时间复杂度为 \(O(V^{2}P)\) ,无法通过大数据。

满分做法

这是一道DP数组二维的区间DP,并且状态转移方程为 \(dp[i][j]=dp[i][k]+dp[k+1][j]+w[i][j]\) 的形式,因此考虑四边形不等式优化。

四边形不等式

定义:

如果对于任意的 \(A\leq B\leq C\leq D\),均满足 \(w[A][C]+w[B][D]\leq w[A][D]+w[B][C]\),则称 \(w\) 满足四边形不等式。

证明:

在这一题中,根据 \(w[i][j]\) 的递推式,可得
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }w[i][j+1]-w[i][j]=v[j+1]-v[(i+j+1)/2]\),
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }w[i+1][j+1]-w[i+1][j]=v[j+1]-v[(i+j+2)/2]\),
两者相减,得
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }w[i][j+1]-w[i][j]-(w[i+1][j+1]-w[i+1][j])\)
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }=v[j+1]-v[(i+j+1)/2]-(v[j+1]-v[(i+j+2)/2])\)
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }=v[j+1]-v[(i+j+1)/2]-v[j+1]+v[(i+j+2)/2]\)
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }=v[(i+j+2)/2]-v[(i+j+1)/2]\geq 0\),

\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }w[i][j+1]-w[i][j]-(w[i+1][j+1]-w[i+1][j])\geq 0\),
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }w[i][j+1]-w[i][j]-w[i+1][j+1]+w[i+1][j]\geq 0\),
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }w[i][j]+w[i+1][j+1]\leq w[i][j+1]+w[i+1][j]\),
\(w\) 满足四边形不等式,则 \(dp\) 同样满足四边形不等式,设 \(s[i][j]\) 为 \(dp[i][j]\) 的最优决策点 \(k\),可得\(s[i][j]\)单调,即\(s[i][j]\leq s[i][j+1]\leq s[i+1][j+1]\),\(s[i][j-1]\leq s[i][j]\leq s[i+1][j]\)(这一点的证明后面会提到),每次让 \(k\) 在 \(s[i][j-1]\) 到 \(s[i+1][j]\) 的范围内枚举,就将原本 \(O(V^{2}P)\) 的DP变为 \(O(VP)\) 的了,可以AC,注意此时 \(i\) 需要倒着枚举,因为需要用到 \(s[i+1][j]\)。

对 \(s[i][j-1]\leq s[i][j]\leq s[i+1][j]\) 的证明

假设状态规划方程是 \(dp[i][j]=dp[i][k]+dp[k+1][j]+w[i][j]\) 的形式,设 \(y\) 为使 \(dp[i][j-1]\) 最小的 \(k\),即 \(s[i][j-1]\),令 \(x<y\),有 \(x+1\leq y+1\leq j-1<j\),根据四边形不等式,得
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }dp[x+1][j-1]+dp[y+1][j]<=dp[y+1][j-1]+dp[x+1][j]\),

\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }dp[i][x]+dp[x+1][j-1]+w[i][j-1]+dp[i][y]+dp[y+1][j]+w[i][j] <=\)\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ } dp[i][x]+dp[x+1][j]+w[i][j]+dp[i][y]+dp[y+1][j-1]+w[i][j-1]\),

\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }dp[i][j-1](k=x)+dp[i][j](k=y)<=dp[i][j](k=x)+dp[i][j-1](k=y)\),
\(\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }dp[i][j-1](k=x)-dp[i][j-1](k=y)<=dp[i][j](k=x)-dp[i][j](k=y)\),
不等式左右两边显然都大于0(\(y\) 是最优决策点,\(dp[i][j]\) 的值最小),所以 \(dp[i][j]\) 的最优决策点一定不是任意一个 \(x\),即 \(s[i][j]\geq s[i][j-1]\)(即 \(y\)),同理可证\(s[i][j]\leq s[i+1][j]\)。

细节

  • 在预处理前需要对 \(v\) 进行排序,保证 \(v[i]\) 的单调(递增)性,否则 \(w[i][j]\) 就不满足四边形不等式,也就无法使用四边形不等式优化了,然而这题数据较水,给出的 \(v[i]\) 本身就是单调递增的,无需排序(别问我怎么知道的)。
  • DP数组要初始化成INF,且\(dp[i][1]=w[1][i]\),DP时 \(j\) 从 \(2\) 开始枚举,否则会使用 \(s[i][0]\) 和 \(dp[k][0]\)。
  • 注意 \(s\) 的边界值:\(s[i][1]=1\)(只建1个邮局时最佳划分点只能是第一个村庄),\(s[v+1][i]=v-1\)(倒序枚举 \(dp[i][j]\) 中的 \(i\),\(v-1\) 即最佳决策点 \(k\) 范围的初始值)。

代码

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int v,p,a[3005],w[3005][3005],f[3005][3005],s[3005][3005],i,j,k;
int main()
{
	ios::sync_with_stdio(false);
	cin>>v>>p;
	for(i=1;i<=v;++i)cin>>a[i];//输入
	//这里本应有sort,但是本题数据过水,a[i]本来就单调递增
	for(i=1;i<v;++i)
		for(j=i+1;j<=v;++j)
			w[i][j]=w[i][j-1]+a[j]-a[i+j>>1];//预处理w[i][j]
	//下面几行都是预处理
	for(i=1;i<=v;++i)
		for(j=1;j<=p;++j)f[i][j]=INF;
	for(i=1;i<=v;++i)f[i][1]=w[1][i],s[i][1]=1;
	for(i=1;i<=p;++i)s[v+1][i]=v-1;
	//上面几行都是预处理
	for(i=2;i<=p;++i)//枚举邮局数
		for(j=v;j>=i;j--)//倒序枚举村庄
			for(k=s[j][i-1];k<=s[j+1][i];++k)//四边形不等式优化
				if(f[k][i-1]+w[k+1][j]<f[j][i])
					f[j][i]=f[k][i-1]+w[k+1][j],s[j][i]=k;//记得更新最优决策点
	cout<<f[v][p]<<endl;
	return 0;
}

标签:frac,leq,IOI2000,题解,邮局,村庄,text,dp
From: https://www.cnblogs.com/-xiaoxiexie-/p/17039966.html

相关文章

  • mysql delete大量数据表锁死,kill的线程后线程处于killed状态问题解决
    一、事件起因删除一张500G的表,没有添加任何约束条件,结果好久都没反应,查询锁之后,使用kill杀掉了进程,再次查询的时候,锁还在,trx_state的状态是ROLLINGBACK,使用showprocessl......
  • 网络流二十四题解题报告
    网络流二十四题解题报告\(\text{ByDaiRuiChen007}\)来源:LOJ-网络流24题机器人路径规划问题数据有误,不计入解题报告中1.飞行员配对方案问题ProblemLink构造二......
  • hidapi 编译成 dll 时出现无法解析外部符号问题解决方法
    问题现象:  解决方法: ......
  • Codeforces 1704 F Colouring Game 题解 (结论,SG函数)
    题目链接首先看R和B的数量不等的情况(很多博弈题都是先比较两种物品的数量,相等的情况再用SG函数之类的技巧),结论是R多Alice必赢,B多Bob必赢。证明:来看R比B多的情况,定义两人......
  • 2023-2-训练赛5 题解
    Buctoj训练赛5题解(C++)A、统计单词数该题目考查对string字符串的灵活运用初步观察题目,可将解题步骤分为大致四个模块输入两行字符串由于题目要求不区分大小写,故将......
  • Namomo Winter Camp D3 Div2 简易题解
    题目提交链接ProblemK.KotlinIsland首先不用考虑描边(那样和不画这条边是一样的)。那么剩下的就是在长度和宽度内枚举了。显然可以知道长宽最多画\((n-1)/2\)和......
  • 十二省联考 2019 题解
    Day1B字符串问题朴素的想法是,建一张\(n_a+n_b\)个点的有向图\(G\)。对于一个支配关系\((x,y)\),从\(x\)向\(y+n_a\)连边。此外,枚举\(1\lei\len_b\),对于每个......
  • 1.9寒假集训-进阶训练赛(五)A-M题解
    前五题网上都有不写了需要注意的是第四题是给定密钥和密文要把它加密算是一个逆过程看了半天都没读懂样例 第六题应该也有但是我写一下因为学校oj这边空间给的是1......
  • HDU-3949 XOR 题解报告
    题目地址题意:从一个序列中取任意个元素进行异或,求能异或出的所有数字中的第k小。分析:性质:一个线性基异或上另一个不同的线性基,并作为自己的新值,这并不改变整个线性......
  • 【CF802O】April Fools' Problem (hard) 题解 (线段树模拟费用流)
    线段树模拟费用流。LG传送门。SolutionPart1根据题面,显然想到此题是费用流。建图方式亦是显然:\(S\rightarrowi\),流量为\(1\),费用为\(a_i\);\(i\rightarrowT_0\)......