首页 > 其他分享 >IOI2022 邮局 加强版 题解

IOI2022 邮局 加强版 题解

时间:2024-07-27 20:50:55浏览次数:9  
标签:lfloor le frac 加强版 int 题解 rfloor IOI2022 ge

[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;
}

标签:lfloor,le,frac,加强版,int,题解,rfloor,IOI2022,ge
From: https://www.cnblogs.com/Atserckcn/p/18327454

相关文章

  • 07-25 题解
    07-25题解原题出处(按顺序):CF1556ECF1234FP9746CF1316EP3651CF17CCF1842HA转化:括号序列如果\(a_i\>b_i\),则有\(a_i-b_i\)个左括号如果\(a_i\<b_i\),则有\(b_i-a_i\)个右括号(第一个+1的位置一定在第一个-1的位置的左侧,所以情况一用左括号......
  • 第二次测试部分题解 (c,d,g)
    c-一个欧拉函数模板题 1#include<iostream>2usingnamespacestd;34intmain()5{6intn;7cin>>n;8intr=n;9for(inti=2;i*i<=n;i++)10{11if(n%i==0)12{13r......
  • 第二次测试部分题解
    A——暴力枚举计数就好了,可以参考这段代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definemod100003#defineMAN1000100charstr[10];intans;voidok(){ ans=0; intlen=0; for(inti=0;str[i]!='\0';i++) len++; if(l......
  • ABC260F 题解
    题面根据题目描述,原图为二分图,设两侧点集为\(S,T\),大小为\(s,t(s\le3\times10^5,t\le3\times10^3)\)。注意到有四元环当且仅当\(T\)中存在一个点对\((a,b)\)同时和\(S\)中的某两个点连边。可以先考虑暴力,一种想法是:考虑枚举\(S\)中的点\(c\),设和\(c\)连边的点......
  • ABC263F 题解
    题面注意到把对局在图上表示出来是一颗满二叉树(叶节点为选手,其他点为对局),可以考虑树形dp。设\(x\)为\([l_x,r_x]\)之间选手的比赛,且该节点到叶子结点距离\(d_x\)。设\(f(x,p)\)表示胜者为\(p\)的最大钱数,有转移:\[\begin{aligned}f(x,p)&=f(lson(x),p)+g(rson(x))+a......
  • ABC262F 题解
    题面把“移动\(a_n\)至数列头”称为rotate,删除一项称为erase。因为要求字典序最小,所以可以逐位贪心。考虑一个数\(a_i\)怎么变成第一个数:使用\(n-i\)次rotate/erase,再rotate一次。删除或移动原来的\(a_{i+1}\sima_n\),再移动原来的\(a_i\)(逐步移动到数列尾,再ro......
  • ABC261F 题解
    题面注意到如果两个球\(i,j\)有\(i<j,x_i>x_j\),那么这两个球一定会交换。所以要交换\(x\)的逆序对数次。但是相同颜色交换没有代价,所以答案是\(x\)的逆序对数减去满足\(c_i=c_j,i<j,x_i>x_j\)的\((i,j)\)对的数量。可以对每个\(j\)都求一遍满足\(c_i=j\)的\(......
  • ABC264F 题解
    题面注意到操作只对当前行/列有效,所以只要记录当前所在行和列是否有被操作。设\(f(i,j,x,y)\)表示到了位置\((i,j)\),第\(i\)行是否被操作,第\(j\)列是否被操作的最小代价。转移:设\(col=c(i,j)\oplusx\oplusy\)。\[\begin{aligned}f(i+1,j,x2,y)&\xleftarrow......
  • ABC265F 题解
    题面\(O(nd^2)\)考虑\(f(i,j,k)\)表示dp到第\(i\)维,距离\(p,q\)曼哈顿距离\(j,k\)的方案数。考虑朴素转移:设\(dis=|p_{i+1}-q_{i+1}|\)。\[\begin{aligned}f(i+1,j+t,k+dis-t)&\getsf(i,j,k)&(0\leqt\leqdis)\quad&(1)\\f(i+1,j+d+t,k+t)&\ge......
  • 题解:CF1608F MEX counting
    题解:CF1608FMEXcounting与其他题解不同,本篇题解是运用辅助数组$g$来解决问题。虽然代码可能要繁琐一点,但是辅助数组的思路适用范围更广一点。首先还是转化为前$i$个数的$mex$在区间$[l_i,r_i]$内。我们用dp数组$f_{i,x,c}$表示处理到了第$i$个数,当前的mex为......