[USACO3.3.4]range

  题目传送门:http://www.nocow.cn/index.php/Translate:USACO/range

  这道题的话如果不是之前做过类似的题目,我想我是做不出来的,大概就是先预处理s[i][j],表示前i行前j列有多少个1,然后O(1)时间判断这个正方形是否有1。

  s[i][j]显然等于是s[i-1][j]+s[i][j-1]-s[i-1][j-1]+f[i][j](两个多边形重复的部分为s[i-1][j-1])

  而判断第i行到第l行,第j列到第k列这个多边形内有没有(j-k+1)*(l-i+1)个1,显然只需判断s[i][j]-s[i-1][k]-s[l][j-1]+s[i-1][j-1]是否等于(j-k+1)*(l-i+1)就行了。(两个多边形的重复部分为s[i-1][j-1])

  会有一点乱,但只要想一想图就好了,而且这道题是正方形,只要枚举边的长度就好了.

  

/*
ID:abc31261
LANG:C++
TASK:range
*/

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=260;
int n,f[maxn][maxn],s[maxn][maxn],num[maxn];
int main()
{
	int i,j,l;
	freopen("range.in","r",stdin);
	freopen("range.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)scanf("%01d",&f[i][j]);
	memset(s,0,sizeof(s));
	memset(num,0,sizeof(num));
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+f[i][j];
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			for (l=2;l<=min(n-i+1,n-j+1);l++)
			{
				int x=i+l-1,y=j+l-1;
				if (s[x][y]-s[x][j-1]-s[i-1][y]+s[i-1][j-1]==l*l)num[l]++;
			}
	for (i=1;i<=n;i++)
		if (num[i]!=0)printf("%d %d\n",i,num[i]);
	return 0;
}

  

时间: 2024-10-10 16:05:44

[USACO3.3.4]range的相关文章

USACO--3.3Home on the Range+DP

二维dp,定义G[i][j]表示i,j为顶点的最大正方形边长.如果G[i][j]本身为1,则转移方程为:G[i][j]=min(G[i+1][j],G[i][j+1],G[i+1][j+1])+1.其实就是由其下方,右方,右下方的点确定它所能构成的最大正方形(在图上可以很清楚的发现这一点). 其实这道题也可以暴力枚举;我们枚举每个点作为正方形左上角顶点时可以得到的最大边长正方形,而边长为k的正方形和k+1的正方形之间是存在关系的. 代码如下: /* ID: 15674811 LANG: C++

range()用法

来源:http://www.cnblogs.com/wangwp/p/4535299.html 例子:http://www.cnblogs.com/hongten/p/hongten_python_range.html 函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, 5); end:技术到end结束,但不包括end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有

Leetcode 34. Search for a Range

34. Search for a Range Total Accepted: 91570 Total Submissions: 308037 Difficulty: Medium Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm's runtime complexity must be in the order of O(l

Swift 中的Range和NSRange不同

Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Swift中的Ranges的使用还是比较合理的,但是想要正确的使用Ranges真的需要一些特别的技巧. 看一个例子,下面这段代码展示的是截取以指定的字符开头和以指定的字符结尾的子字符串: ? 1 2 3 4 5 6 var str = "Hello, playground"   let ran

swift -- 定义空字符串 hasPrefix hasSuffix trim split join range

// 定义空的字符串 var str1 = "" var str2 = String() str1.isEmpty      // 判断字符串是否为空 // 输出字符串中所有的字符 var str3 = "As god name" for c in str3{ println(c) } Int.max   // Int类型的最大值 Int.min   // Int类型的最小值 var arr1 = ["c", "oc", &q

qvalue: Check that you have valid p-values or use a different range of lambda

ERROR: The estimated pi0 <= 0. Check that you have valid p-values or use a different range of lambda. 重现错误的代码: ps <- runif(3e5)library(qvalue)ps <- ps[ps < 0.75]qs <- qvalue(ps) Error in pi0est(p, ...) :  ERROR: The estimated pi0 <= 0. C

SAP程序代码中RANGE表的用法注意点

前几天写了个程序,在读SQL代码的时候,选择条件 in 一张range table,结果导致程序DUMP,SAP的LOG如下: 错误原因:RANGE表当用于WHERE条件是,只限较小的数据量的情况(约2000条左右): 若为大数据量应该用FOR ALL ENTRIES IN的语法,或者其它方式来改写.否则会DUMP

[LeetCode]Count of Range Sum

题目:Count of Range Sum Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note:A naive algorithm

python练习-for range if continue

for i in range (1,6):        print         print         print "i=", i,         print "hello,how",         if i==3:             continue         print 'are you today?'