首页 > 其他分享 >【DP】ABC273F Hammer 2 题解

【DP】ABC273F Hammer 2 题解

时间:2023-10-05 22:47:44浏览次数:38  
标签:cnt ABC273F int 题解 ++ Hammer DP

ABC273F

一道比较板的区间 \(\text{dp}\)。

先对坐标离散化,令离散化数组为 \(v\)。

令 \(f_{i,j}\) 表示能走到区间 \([v_i,v_j]\) 的最短路程,显然 \(f\) 数组初始为 \(inf\)。

但发现这样无法转移,可以再增加一维 \(k \in \{0,1\}\),表示此时在 \([v_i,v_j]\) 的 \(v_i/v_j\) 处。

则有转移方程:

\[f_{i-1,j,0} = \min\{f_{i-1,j,0}, f_{i,j,0}+v_i-v_{i-1}, f_{i,j,1}+v_j-v_{i-1}\} \]

\[f_{i,j+1,1} = \min\{f_{i,j+1,1}, f_{i,j,0}+v_{j+1}-v_i, f_{i,j,1}+v_{j+1}-v_j\} \]

代码:

const int N = 1.5e3 + 5;
int n, x;
int a[N], b[N], v[N << 1], pos[N << 1];
ll f[N << 1][N << 1][2];

int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cin >> n >> x;
	int cnt = 0;
	v[++cnt] = 0, v[++cnt] = x;
	for (int i = 1; i <= n; i++) std::cin >> a[i], v[++cnt] = a[i];
	for (int i = 1; i <= n; i++) std::cin >> b[i], v[++cnt] = b[i];
	std::sort(v + 1, v + cnt + 1);
	cnt = std::unique(v + 1, v + cnt + 1) - (v + 1);
	for (int i = 1; i <= n; i++) {
		int k1 = std::lower_bound(v + 1, v + cnt + 1, a[i]) - v, k2 = std::lower_bound(v + 1, v + cnt + 1, b[i]) - v;
		a[i] = k1, b[i] = k2, pos[a[i]] = i;
	}
	int s = std::lower_bound(v + 1, v + cnt + 1, 0) - v, t = std::lower_bound(v + 1, v + cnt + 1, x) - v;
	memset(f, 0x3f, sizeof(f));
	f[s][s][0] = f[s][s][1] = 0;
	for (int l = 1; l <= cnt; l++)
		for (int i = 1; i <= cnt - l + 1; i++) {
			int j = i + l - 1;
			if (i > 1) {
				int p = pos[i - 1];
				if (!p || (i <= b[p] && b[p] <= j))
					f[i - 1][j][0] = std::min(f[i - 1][j][0], std::min(f[i][j][0] + v[i] - v[i - 1], f[i][j][1] + v[j] - v[i - 1]));
			}
			if (j < cnt) {
				int p = pos[j + 1];
				if (!p || (i <= b[p] && b[p] <= j))
					f[i][j + 1][1] = std::min(f[i][j + 1][1], std::min(f[i][j][0] + v[j + 1] - v[i], f[i][j][1] + v[j + 1] - v[j]));
			}
		}
	ll ans = f[0][0][0];
	for (int i = 1; i <= t; i++)
		for (int j = t; j <= cnt; j++)
			ans = std::min(ans, std::min(f[i][j][0], f[i][j][1]));
	std::cout << (ans == f[0][0][0] ? -1 : ans) << "\n";
	return 0;
}

标签:cnt,ABC273F,int,题解,++,Hammer,DP
From: https://www.cnblogs.com/Pengzt/p/17744051.html

相关文章

  • 【线段树合并】CF1805E There Should Be a Lot of Maximums 题解
    CF1805E待补:有另解看到维护树上问题,可以想到线段树合并。但直接维护显然不行,要一点技巧。发现\(val\)的出现次数\(cnt_{val}\)如果\(\ge3\),那么一定是一个候选项,若\(cnt_{val}=1\),那么一定不能作为候选项。于是可以用权值线段树维护对于\(val\)有\(cnt_{val}=......
  • [ABC257F] Teleporter Setting 题解
    1.题目洛谷传送门2.思路我们可以把不确定的点当成真实存在的\(0\)号点,建边的时候就正常连即可。然后我们来看一个样例:1-2-03-4-5当我们把\(0\)号点看成\(3\)号点时,答案就是\(1\)号点到\(0\)号点的距离加上\(3\)号点到\(5\)号点的距离。然后我们再......
  • 【思维】【DP】ABC298Ex Sum of Min of Length 题解
    ABC298Ex简单题。因为有\(\min\)不好做,容易想到讨论\(d(i,L)\)和\(d(i,R)\)的大小。令\(p=\text{LCA}(L,R)\),\(dep_L>dep_R,dist=dep_L+dep_R-2\timesdep_p\),\(now\)满足\(dep_L-dep_{now}=\lfloor\dfrac{dist}{2}\rfloor\)则\(L\)一定在......
  • 【图论】【寻找性质】CF1151E Number of Components 题解
    CF1151E发现每一个\(f(l,r)\)中的连通块总是一条链(一棵树)。那么此时连通块的数量就等于点的数量减去边的数量。先考虑点的总数,一个价值为\(a_i\)的点一定是在\(l\leqslanta_i\)且\(r\geqslanta_i\)的\(f(l,r)\)中才会有一个贡献,根据乘法原理,它会产生\(a_i\time......
  • 【二分】P7795 [COCI2014-2015#7] PROSJEK 题解
    P7795典。显然\(\mathcal{O}(n^2)\)的时间复杂度无法通过。使子段平均值最大,考虑二分。可以二分平均值\(mid\),然后判断是否有满足条件的子段.时间复杂度:\(\mathcal{O}(\dfrac{n\log\max\{a_i\}}{\text{eps}})\),其中\(\text{eps}\)为设置的精度,\(\max\{a_i\}\leq10......
  • P8565 Sultan Rage 题解
    P8565发现数列\(a\)增长的特别快,项数最多时是\(a_1=a_2=\cdots=a_{100}\),但这样也只会有一百多项就可以超过\(10^{18}\)。可以考虑搜索,因为搜索树会比较稀疏,函数dfs(val,cur)表示凑出\(x\)还需要\(val\),现在在考虑\(cur\)。但光是搜索肯定不能过这道题,考虑优......
  • P4133 [BJOI2012]最多的方案 题解
    P4133双倍经验发现斐波那契数列增长极快,不到\(100\)项就超过了\(10^{18}\),搜索树也极为稀疏,可以考虑搜索。爆搜肯定会超时,考虑优化:可行性剪枝。记忆化,去除重复的计算。改变搜索的顺序,因为先考虑小元素的话,会有较多的无用的搜索,且小元素较灵活,更容易凑到\(x\),故可......
  • 【竞赛图】【DP】ARC163D Sum of SCC 题解
    ARC163D发现这个竞赛图一定能被分为两个集合\(A\),\(B\)。满足\(\forallu\inA,v\inB\),均有\(u\tov\inE\)。答案就是划分这两个集合的方案数。证明:首先,竞赛图缩完点后一定是一条链,对强连通分量进行标号,满足编号小的强连通分量指向编号大的强连通分量。不妨令竞赛图\(G\)......
  • 【整除分块】【DP】ABC239Ex Dice Product 2 题解
    ABC239H简单题。令\(f_i\)表示乘到\(\gei\)的期望。容易得到\(f_i=\dfrac{\sum\limits_{j=1}^{n}f_{\lceil\frac{i}{j}\rceil}}{n}\)。将\(f_i\)移到同一边,去掉系数,有\(f_i=\dfrac{n\sum\limits_{j=2}^{n}f_{\lceil\frac{i}{j}\rceil}}{n-1}\)。提出\(\frac{n-1}{n......
  • 【字符串】【哈希】ABC284F ABCBAC 题解
    ABC284F这题的正解是\(Z\)函数。如果\(str=T+T\)的话,若可以找到连续的分别长为\(n\)的两段,且这两段可通过\(1\)次翻转变为相同的字符串,那么便一定有解,否则无解。暴力判断是\(\mathcal{O}(n)\)的,时间复杂度直接上天。可以用哈希\(\mathcal{O}(1)\)地判断出两个......