[luoguP1578] 奶牛浴场(DP)

传送门

O(s2)算法

详见论文 王知昆--浅谈用极大化思想解决最大子矩形问题

我就复制你能把我怎么样QAQ

#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 5010
#define max(x, y) ((x) > (y) ? (x) : (y))
#define min(x, y) ((x) < (y) ? (x) : (y))

int L, W, n, ans;
struct node
{
	int x, y;
}p[N];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
	return x * f;
}

inline bool cmp1(node a, node b)
{
	return a.y < b.y;
}

inline bool cmp2(node a, node b)
{
	return a.x < b.x;
}

int main()
{
	int i, j, x, u, d;
	L = read();
	W = read();
	n = read();
	for(i = 1; i <= n; i++) p[i].x = read(), p[i].y = read();
	p[++n].x = 0, p[n].y = 0;
	p[++n].x = 0, p[n].y = W;
	p[++n].x = L, p[n].y = 0;
	p[++n].x = L, p[n].y = W;
	std::sort(p + 1, p + n + 1, cmp1);
	for(i = 2; i <= n; i++)
	{
		x = p[i].y - p[i - 1].y;
		ans = max(ans, x * L);
	}
	std::sort(p + 1, p + n + 1, cmp2);
	for(i = 1; i <= n; i++)
	{
		u = W;
		d = 0;
		for(j = i + 1; j <= n; j++)
		{
			if(p[j].x == p[i].x) continue;
			ans = max(ans, (u - d) * (p[j].x - p[i].x));
			if(p[j].y == p[i].y)
			{
				if(u - p[j].y > p[j].y - d) d = p[j].y;
				else u = p[j].y;
			}
			else
			{
				if(p[j].y > p[i].y) u = min(u, p[j].y);
				else d = max(d, p[j].y);
			}
		}
	}
	for(i = n; i >= 1; i--)
	{
		u = W;
		d = 0;
		for(j = i - 1; j >= 1; j--)
		{
			if(p[j].x == p[i].x) continue;
			ans = max(ans, (u - d) * (p[j].x - p[i].x));
			if(p[j].y == p[i].y)
			{
				if(u - p[j].y > p[j].y - d) d = p[j].y;
				else u = p[j].y;
			}
			else
			{
				if(p[j].y > p[i].y) u = min(u, p[j].y);
				else d = max(d, p[j].y);
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}

  

时间: 2024-10-09 05:04:34

[luoguP1578] 奶牛浴场(DP)的相关文章

洛谷P1578 奶牛浴场

P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是

vijos p1005 奶牛浴场[ 极大化思想]

奶牛浴场 描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是产奶点可以位于浴

奶牛抗议 DP 树状数组

奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i]-sum[j]\ge0) \] \(O(n^2)\)过不了,考虑优化 移项得: \[ f[i]=\sum f[j]\;(j< i,sum[i]\ge sum[j]) \] 这时候我们发现相当于求在\(i\)前面并且前缀和小于\(sum[i]\)的所有和,这就可以用一个树状数组优化了,在树状数组维护下标为

BZOJ_1616_[Usaco2008_Mar]_Cow_Travelling_游荡的奶牛_(DP)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1616 给出一张图,有些点不能走,给出起始点和结束点,以及时间,求在该时间到达结束点的方案数. 分析 直接DP即可. \(f[i][j][k]\)表示在\(i\)时间走到\((j,k)\)的方案数. 在\(i\)时间从点\((a,b)\)走到\((c,d)\): \(f[i][c][d]+=f[i-1][a][b]\). 1 #include <bits/stdc++.h> 2 using

BZOJ 1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛:dp【网格型】

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1616 题意: 有一个n*m的网格. '.'表示平坦的草地,'*'表示挡路的树(不能走). 有一只奶牛,第0秒时在(r1,c1),第t秒时在(r1,c2). 它每一秒钟都会向上下左右任一方向走一格,不会停留不动. 问你在这t秒钟内,奶牛可能的移动路径数. 题解: 表示状态: dp[i][j][k]:表示在第k秒,走到了位置(i,j)时的方案数. 找出答案: ans = dp[r2][c2]

[Usaco2008 Mar]Cow Travelling游荡的奶牛[简单DP]

Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T (0 < T <= 15)秒后,FJ又在位置(R2, C2)与贝茜撞了正着. FJ并不知道在这T秒内贝茜是否曾经到过(R2, C2),他能确定的只是,现在贝茜在那里. 设S为奶牛在T秒内从(R1, C1)走到(R2, C2)所能选择的路径总数,F

P1578 奶牛浴场

题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必须在牛场中的一个固定的位置产奶,而奶牛显然不能在浴场中产奶,于是,John希望所建造的浴场不覆盖这些产奶点.这回,他又要求助于Clevow了.你还能帮助Clevow吗? John的牛场和规划的浴场都是矩形.浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合.浴场不能覆盖任何产奶点,但是产奶点可以位于浴场的轮

Vijos 1055 奶牛浴场 最大子矩阵 算♂法①

题意:链接 方法:最大子矩阵之算♂法① 解析: 首先谈到最大子矩阵,我们可能会想到之前做过的盖房子?,那道DP求解的题目. 然而这种题目当然有更高♂端的算法. 比如接下来要谈到的算法①. 我们先来观察数据范围,n,m<=30000,这下就玩完了,怎么dp? 一下子就D掉了你原来的算法,真是不留情面. 那么我们来介绍一种新的算法. 首先谈暴力,枚举各种坏点,但这种的复杂度呢?甚至可能达到6次方,所以怎么优化呢? 按照经验,这种坐标图排个序就能降下复杂度什么的. 于是有神犇介绍了s^2复杂度的算法,

Vijos1055 奶牛浴场(极大化思想求最大子矩形)

思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路也很简单 先根据x排序 之后两重循环,枚举i后的每一个点j到i可以形成的矩形面积 怎么求这个矩形面积呢? 非常简单,miny,maxy,分别表示纵坐标的上下界 如果枚举的点j比i的y大,那么就修改上界,反之,修改下界(具体的,可以看论文中的图,更直观些) 这里需要注意两个遗漏的地方(论文中也有特别提到) 就是