UVA11261 Bishops

给出一个n*n的棋盘和m个象,每个象能够覆盖它所在的对角线,问没有被覆盖的点有多少个

对于一头大象它可以覆盖它所在的从对角线和主对角线,但是些对角线可能相互交叉,因此不能直接求对角线上面的点的个数。n*n的暴力方法很好想出来,但是肯定超时。

我们可以把主对角线和从对角线保存下来,预处理好没有被覆盖的点,dp[i]表示第i条从对角线上面没有被覆盖的点,一共有2*n-1条从对角线。对于从对角线的上半部分,dp[i]初始化为dp[i-2]因为他们的奇偶性相同,则除去第i条从对角线的两个端点以外,如果第i-2条从对角线上的某个点被一条主对角线覆盖,那么它右下角对应的从对角线上的点也被覆盖。时间复杂度为O(N)。

#include<cstdio>
#include<cstring>
#define MAXN 80005
using namespace std;
bool cover_positive[MAXN];//主对角线是否被覆盖
bool cover_negative[MAXN];//从对角线是否被覆盖
int dp[MAXN];//保存第i条从对角线有多少个点没有被覆盖
int n,m;
int main()
{
	int T;
	scanf("%d",&T);
	int cnt = 0;
	while(T--)
	{
		memset(cover_positive,0,sizeof cover_positive);
		memset(cover_negative,0,sizeof cover_negative);
		memset(dp,0,sizeof dp);
		scanf("%d%d",&n,&m);
		int x,y;
		for(int i = 1; i <= m; i++)
		{
			scanf("%d%d",&x,&y);
			cover_positive[n+x-y] = 1;
			cover_negative[x+y-1] = 1;
		}

		if(!cover_positive[n]) dp[2*n-1] = dp[1] = 1;//第n条主对角线没有被覆盖,因此第1和第2n-1条对角线上面有一个没有被覆盖的点
		for(int i = 2; i <= n; i++)
		{
			dp[i] = dp[i-2];//dp[i]由dp[i-2]转移过来,第i条对角线比第i-2条对角线多左下和右上2个点,
			//如果第i-2条对角线的其他点被覆盖,那么第i条对角线上的点也会被覆盖
			int num = n - i + 1;
			if(!cover_positive[num]) ++dp[i];
			if(!cover_positive[2*n-num]) ++dp[i];
		}
		for(int i = 2*n-2; i >= n+1; i--)
		{
			dp[i] = dp[i+2];//另外一半对角线与之前的一半相反
			int num = i - n + 1;
			if(!cover_positive[num]) ++dp[i];
			if(!cover_positive[2*n-num]) ++dp[i];
		}

		int ans = 0;
		for(int i = 1; i < 2*n; i++)
			if(!cover_negative[i])
				ans += dp[i];
		printf("Case #%d: %d\n",++cnt,ans);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 17:00:28

UVA11261 Bishops的相关文章

codeforces Gargari and Bishops(很好的暴力)

1 /* 2 题意:给你一个n*n的格子,每一个格子都有一个数值!将两只bishops放在某一个格子上, 3 每一个bishop可以攻击对角线上的格子(主对角线和者斜对角线),然后会获得格子上的 4 数值(只能获取一次).要求输出两个bishops获取的最大值以及它们所在的位置! 5 6 7 思路:直接暴力!....不错的暴力题目! 8 首先我们都知道每一条主对角线上的横纵坐标的和相同,每一条副对角线上的横纵坐标的差相同! 9 那么我们在输入的时候就可以将所有对角线上的数值之和求出来了! 10

UVA 10237 - Bishops(递推)

UVA 10237 - Bishops 题目链接 题意:问一个n * n棋盘能放k个主教(攻击斜线)的方案数. 思路:递推,首先考虑一个问题,在一个n?n棋盘上,放k个车的方案数. 那么设dp[i][j]为i行用了j个车的方案数,由于每行只能放一个车,那么考虑i行放不放车,如果放车,那么能放的位置有n?(j?1)个位置,为dp[i?1][j?1]?(n?(j?1)). 如果不放那么情况为dp[i?1][j]. 所以递推式为dp[i][j]=dp[i][j?1]+dp[i?1][j?1]?(n?(

Little Bishops uva861

Little Bishops A bishop is a piece used in the game of chess which is played on a board of square grids. A bishop can only move diagonally from its current position and two bishops attack each other if one is on the path of the other. In the followin

uva 10237 - Bishops(dp)

克里斯·厄姆森 谷歌今天在 Code 大会上发布了新的无人驾驶汽车.该汽车看起来像是有轮子的缆车,它既没有驾驶盘,也没有刹车踏板和加速装置.Re/code 采访了谷歌无人驾驶汽车项目主管克里斯·厄姆森(Chris Urmson),期间谈及该项目革命背后的概念.产品何时上路等问题. 谷歌在过去的 5 年里改装了现成车型去试验无人驾驶技术.除了车顶的旋转激光装置外,它们看上去跟普通车没什么不同.而该公司今天发布的汽车看上去则非常怪异.它们又小又圆,配备各种小型黑色传感器(车顶也有旋转激光装置),用泡

UVA - 10237 Bishops

A bishop is a piece used in thegame of chess which is played on a board of square grids. A bishop can only movediagonally from its current position and two bishops attack each other if oneis on the path of the other. In the following figure, the dark

Wet Shark and Bishops(思维)

Today, Wet Shark is given n bishops on a 1000 by 1000 grid. Both rows and columns of the grid are numbered from 1 to 1000. Rows are numbered from top to bottom, while columns are numbered from left to right. Wet Shark thinks that two bishops attack e

CodeForces 621B Wet Shark and Bishops

记录一下每个对角线上有几个,然后就可以算了 #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<vector> #include<algorithm> using namespace std; const int maxn=2000+10; int n; long long w1[maxn]; long long w2[maxn]; l

SGU 221.Big Bishops(DP)

题意: 给一个n*n(n<=50)的棋盘,放上k个主教(斜走),求能放置的种类总数. Solution : 同SGU 220,加个高精度就好了. code #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; string f[2][250][250], ans;

【CodeForces 621B】Wet Shark and Bishops

题 题意 1000*1000的格子里,给你n≤200 000个点的坐标,求有多少对在一个对角线上. 分析 如果求每个点有几个共对角线的点,会超时. 考虑到对角线总共就主对角线1999条+副对角线1999条,我们可以求每个对角线有几对点. 同一条主对角线上的元素有a[i]个,就有C(a[i],2)对点: 同一条副对角线上的元素有b[i]个,就有C(b[i],2)对点. 读入x和y后, x+y相同的就在同一副对角线,x+y范围是(2,2000), x-y相同的就是同一主对角线,x-y范围是(-999