【BZOJ 1177】【APIO 2009】Oil

http://www.lydsy.com/JudgeOnline/problem.php?id=1177

前缀和优化,时间复杂度$O(nm)$

因为数据不全,快速读入会导致RE,切记!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1503;
int in() {
	int k = 0, fh = 1; char c = getchar();
	for(; c < ‘0‘ || c > ‘9‘; c = getchar())
		if (c == ‘-‘) fh = -1;
	for(; c >= ‘0‘ && c <= ‘9‘; c = getchar())
		k = (k << 3) + (k << 1) + c - ‘0‘;
	return k * fh;
}

int a[N][N], a1[N][N], a2[N][N], a3[N][N], a4[N][N], s[N][N];
int n, m, k, m1[N][N], m2[N][N], m3[N][N], m4[N][N], h[N], l[N];

void init1() {
	int S;
	for(int i = k; i <= n; ++i)
		for(int j = k; j <= m; ++j) {
			S = s[i][j] - s[i - k][j] - s[i][j - k] + s[i - k][j - k];
			a1[i - k + 1][j - k + 1] = S;
			a2[i - k + 1][j] = S;
			a3[i][j - k + 1] = S;
			a4[i][j] = S;
		}
}

void init2() {
	for(int i = n - k + 1; i >= 1; --i)
		for(int j = m - k + 1; j >= 1; --j)
			m1[i][j] = max(a1[i][j], max(m1[i + 1][j], m1[i][j + 1]));
	for(int i = n - k + 1; i >= 1; --i)
		for(int j = k; j <= m; ++j)
			m2[i][j] = max(a2[i][j], max(m2[i + 1][j], m2[i][j - 1]));
	for(int i = k; i <= n; ++i)
		for(int j = m - k + 1; j >= 1; --j)
			m3[i][j] = max(a3[i][j], max(m3[i - 1][j], m3[i][j + 1]));
	for(int i = k; i <= n; ++i)
		for(int j = k; j <= m; ++j)
			m4[i][j] = max(a4[i][j], max(m4[i - 1][j], m4[i][j - 1]));
}

int main() {
	scanf("%d%d%d", &n, &m, &k);
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j) {
			scanf("%d", &a[i][j]);
			s[i][j] = s[i - 1][j] + s[i][j - 1] + a[i][j] - s[i - 1][j - 1];
		}

	init1();

	init2();

	int ans = 0, f1, f2, f3, f4;
	for(int i = k; i <= n - k; ++i)
		for(int j = k; j <= m - k; ++j) {
			f1 = m4[i][j] + m3[i][j + 1] + m1[i + 1][1];
			f2 = m3[i][j + 1] + m1[i + 1][j + 1] + m2[1][j];
			f3 = m2[i + 1][j] + m1[i + 1][j + 1] + m3[i][1];
			f4 = m4[i][j] + m2[i + 1][j] + m4[1][j + 1];
			ans = max(ans, f1);
			ans = max(ans, f2);
			ans = max(ans, f3);
			ans = max(ans, f4);
		}

	for(int i = k + 1; i <= n - (k << 1) + 1; ++i)
		for(int j = 1; j <= m - k + 1; ++j)
			h[i] = max(h[i], a1[i][j]);
	for(int i = k; i <= n - (k << 1); ++i)
		ans = max(ans, m3[i][1] + m1[i + k + 1][1] + h[i + 1]);
	for(int j = k + 1; j <= m - (k << 1) + 1; ++j)
		for(int i = 1; i <= n - k + 1; ++i)
			l[j] = max(l[j], a1[i][j]);
	for(int j = k; j <= m - (k << 1); ++j)
		ans = max(ans, m2[1][j] + m1[1][j + k + 1] + l[j + 1]);

	printf("%d\n", ans);
	return 0;
}

APIO的题目~

时间: 2024-08-03 19:22:53

【BZOJ 1177】【APIO 2009】Oil的相关文章

【BZOJ 1177】 [Apio2009]Oil

1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 1044  Solved: 404 [Submit][Status][Discuss] Description 采油区域 Siruseri政府决定将石油资源丰富的Navalur省的土地拍卖给私人承包商以建立油井.被拍卖的整块土地为一个矩形区域,被划分为M×N个小块. Siruseri地质调查局有关于Navalur土地石油储量的估测数据.这些数据表示为M×N个非

【BZOJ】【1177】【APIO2009】Oil

DP 找出三个正方形,可以转化为将整个油田切成三个矩形块,每块中各找一个正方形区域,切的形式只有6种,分类更新ans即可 题解:http://trinklee.blog.163.com/blog/static/238158060201482371229105/ 另:这题一般的快速读入不知为何会RE,但是题解里这位大神的快速读入就能AC……跪了跪了 1 /************************************************************** 2 Problem

【BZOJ 2820】 YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 807  Solved: 404 [Submit][Status] Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示

【BZOJ】3319: 黑白树

http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种:1.查询u到根的第一条黑边的编号.2.将u到v的路径全部染成黑色 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>

P2433 - 【BZOJ 3262三维偏序】陌上花开------三维偏序

P2433 - [BZOJ 3262三维偏序]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb.显然,两朵花可能有同样的属性.需要统计出评出每个等级的花的数量. Input 第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,

【bzoj】4538: [Hnoi2016]网络

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4538 维护一个数据结构支持对于一颗树的操作,需要支持: 1.对于树上的一条路径上的每个点上放一个值. 2.撤销某次操作的路劲放. 3.查询除了经过这个点的路径的最大值. 往一个路径上丢值相当于往不经过条路径的所有点上丢值. 用一个树链剖分即可维护,对于操作区间取反. 直接查询单点最大值即可. 为了维护单点最大值,线段树中的每一个点对应两个堆,用于维护插入誉删除. 防止爆空间,所以标记永久

【BZOJ】1821: [JSOI2010]Group 部落划分 Group(最小生成树+贪心)

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1821 这题裸题. 本题要求最短距离最长,很明显,我们排序. 这里存在贪心,即我们把边权最小的全分给n个部落的内部,然后剩下的边最小的就是答案. 将边权较小的边分给k个部落,用并查集生成最小树,使得内部的边总是小于连到外部的边.然后分剩下k个点即可,剩下的k个点的那条边一定是部落之间最小的且最长的边. #include <cstdio> #include <cstring> #

【BZOJ】【3083】遥远的国度

树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果root在x的子树中(以1为根dfs的时候),那么现在x的子树就变成了整个dfs序中,除去含有root的那个子树的剩下的部分,画个图大概就是这样:(红色部分为现在的子树) 我们发现,这种子树由于换根而产生变化的情况,仅当在以1为根时的树中,x是new_root的祖先时发生,那么我们判断这种情况是否发生只需

【BZOJ 1854】 [Scoi2010]游戏

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 2609  Solved: 931 [Submit][Status] Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极boss,这个终极bos