首页 > 其他分享 >P5975 photo 题解

P5975 photo 题解

时间:2024-09-22 21:48:33浏览次数:11  
标签:Xtot Ytot MxY int 题解 rep mid P5975 photo

Solution

先离散化,记 \(f(l,r,p)\) 为覆盖了 \([l,r]\) 区间内纵坐标 \(\ge p\) 的点最少矩形个数。则:

\[ f(l,r,p)=\min(f(l,r,p),f(l,mid,p)+f(mid+1,r,p)) \]

\[ f(l,r,p)=\min(f(l,r,p),f(l,r,res)+1) \]

令 \(h\) 为用面积为 \(S\) 的矩形去覆盖 \([l,r]\) 区间的高度,即 \(S/(r-l)\)。 其中 \(res\) 为横坐标区间 \([l,r]\) 内纵坐标大于 \(h\) 的最小高度。

Code

不保证输入输出格式正确。

#include <bits/stdc++.h>
using namespace std;
#define rep(i, j, k) for (int i = (j); i <= (k); ++i)
#define reo(i, j, k) for (int i = (j); i >= (k); --i)
typedef long long ll;
const int N = 110;
int n, S, Xtot, X[N], Ytot, Y[N], MxY[N], f[N][N][N];
vector<int> Ys[N];
struct Point {
	int x, y;
} a[N];

void init() {
	memset(f, 0, sizeof(f));
	memset(MxY, 0, sizeof(MxY));
	rep(i, 1, n) Ys[i].clear();
}

void solve() {
	cin >> n >> S, init(), Xtot = Ytot = 0;
	rep(i, 1, n) cin >> a[i].x >> a[i].y;
	sort(a + 1, a + n + 1, [&](Point u, Point v) {
		return u.x == v.x ? u.y < v.y : u.x < v.x;
	});
	rep(i, 1, n) X[++Xtot] = a[i].x, Y[++Ytot] = a[i].y;
	sort(X + 1, X + Xtot + 1), sort(Y + 1, Y + Ytot + 1);
	Xtot = unique(X + 1, X + Xtot + 1) - X - 1;
	Ytot = unique(Y + 1, Y + Ytot + 1) - Y - 1;
	auto GetX = [&](int x) { return lower_bound(X + 1, X + Xtot + 1, x) - X; };
	auto GetY = [&](int y) { return lower_bound(Y + 1, Y + Ytot + 1, y) - Y; };
	rep(i, 1, n) a[i].x = GetX(a[i].x), a[i].y = GetY(a[i].y);
	rep(i, 1, n) MxY[a[i].x] = max(MxY[a[i].x], a[i].y), Ys[a[i].x].push_back(a[i].y);
	rep(len, 1, Xtot) {
		rep(l, 1, Xtot - len + 1) {
			int r = l + len - 1;
			reo(p, Ytot, 1) {
				if (len == 1) {
					f[l][r][p] = p <= MxY[l];
				} else {
					f[l][r][p] = 2e9;
					rep(k, l, r - 1) f[l][r][p] = min(f[l][r][p], f[l][k][p] + f[k + 1][r][p]);
					int h = S / (X[r] - X[l]), res = Ytot + 1;
					rep(k, l, r) {
						int L = 0, R = Ys[k].size() - 1, mid = 0, Res = Ytot + 1;
						while (L <= R) {
							mid = (L + R) >> 1;
							if (Y[Ys[k][mid]] > h) Res = mid, R = mid - 1;
							else L = mid + 1;
						}
						if (Res != Ytot + 1) res = min(res, Ys[k][Res]);
					}
					f[l][r][p] = min(f[l][r][p], f[l][r][res] + 1);
				}
			}
		}
	}
	cout << f[1][Xtot][1] << '\n';
}

int main() {
	freopen("scene.in", "r", stdin), freopen("scene.out", "w", stdout);
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int t;
	cin >> t;
	while (t--) solve();
	return 0;
}

标签:Xtot,Ytot,MxY,int,题解,rep,mid,P5975,photo
From: https://www.cnblogs.com/laijinyi/p/18425946

相关文章

  • P9192 Pareidolia 题解
    Statement给串\(t\),定义\(B(s)\)为\(s\)删一些字符后能出现最多多少个bessie,\(A(t)\)表示对\(t\)的所有子串\(s\)求\(B(s)\)的和,有\(q\)次单点修改,每次改完输出\(B(s)\).Solution动态dp,但是带矩乘\(6^3\)常数,不好.还是考虑分治咋做.现在有区间\([l,mid],......
  • P3703 树点涂色 题解
    Statement树,每个点有一个颜色,初始每个点颜色互不相同到根链涂上新颜色链颜色数\(u\)子树内点\(v\)到根路径的最多颜色数Solution首先,相同颜色的点一定构成一条从下往上的链考虑LCT,维护一个性质:一条实链的点的颜色相同.于是\(u\)到根的颜色数\(=\)\(u\)到根的虚......
  • 最长公共子串 题解
    StatementQ7.1.2.4,时限4s给一个串,定义\(\mathrm{LCS}\)为最长公共子串长度,\(q\)次询问,每次给出\(l,r\),求\[\operatorname{xor}_{i=1}^{r-l+1}\{i+\mathrm{LCS}(S[l,l+i-1],S[l+i-1,r])\}\]\(n\le10^5,q\le30\)Solutiontag:SA,线段树维护分治结构,orzhunction题目就是......
  • BZOJ 2555 = P5212 SubString 题解
    Statement给你一个字符串 \(\text{init}\),要求你支持两个操作:在当前字符串的后面插入一个字符串;询问字符串 \(s\) 在当前字符串中出现了几次?(作为连续子串)你必须在线支持这些操作。Solutionextend中link[cur]=q,相当于link,链加新建copy那里,相当于link,cut,链加询......
  • 2024 秋季模拟赛题解
    2024秋季模拟赛题解CSP-S模拟赛2024.9.8CSP-S模拟赛28T1签到题。对\(b\)分解质因数后便容易求解。T2考虑枚举\(\gcd(S)\)的取值\(x\),则\(\operatorname{lcm}(S)=m-x\)。那么同时变形\(\gcd\)和\(\operatorname{lcm}\)变为\(\gcd(S)=1,\operatorname{lcm}......
  • BZOJ 3277 串 题解
    Statement给 \(n\) 个串,问每个串有多少子串是所有 \(n\) 个串中至少 \(k\) 个串的子串。Solution1%%注意到\(\text{LCP}\)在后缀排序后一定是连续的一段,包含一个串的区间是连续的先预处理出对于所有左端点\(l\),最左的\(r\)满足\([l..r]\)中出现了至少\(k\)个......
  • BZOJ 4310 跳蚤 题解
    Statement把\(S\)分成不超过\(k\)段,使每段的最大子串中的最大串最小。输出这个串。Solution按排名二分这个串,check中从右往左贪心地划分,需要实现\(O(1)\)比较两个子串大小。#include<bits/stdc++.h>usingnamespacestd;#definerep(i,j,k)for(inti=(j);i<......
  • BZOJ 4545 DQS 的 trie 题解
    Statement维护一棵树,边权\(\in\{\texttta,\textttb,\textttc\}\),根为\(1\),定义这棵树的子串为从\(1\)走到所有点构成的字符串的所有后缀,需要支持以下操作:问当前树的本质不同子串数给一个点添加一棵子树问一个串在当前树中作为子串的出现次数Solution直接广义SAM+......
  • 力扣72-编辑距离(Java详细题解)
    题目链接:力扣72-编辑距离前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。dp五部曲。1.确定dp数组和i下标的含义。2.确定递推公式。3.dp初始化。4.确定dp的遍历顺序。5.如果没有ac打印dp数组利于debug。每一个dp题目如果都用这五步分析清楚,那么......
  • ABC372 F 题解
    F-TeleportingTakahashi2先把问题转化一下:把环断开成链,复制\((K+1)\)层,每走一步就相当于前进一层:可以想到一个简单的dp:设\(f(i,j)\)表示走到第\(i\)层第\(j\)个位置的方案数。初始化:\(f(0,1)=1\),其它均为\(0\),表示Takahashi从第\(0\)层的\(1\)位置......