Gargari and Bishops CodeForces - 463C

原题链接
考察:思维
错误思路:
  预处理对角线和,枚举每一个点,发现与该点相邻的点都不冲突.
错误原因:
  但凡图画大点就可以发现不止是相邻的点,也不是用相邻的点对角线路过的点.
思路:
  正解是与枚举点奇偶性不同的点.....直接暴力枚举完事.

Code

#include <iostream> 
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 2010;
int mp[N][N],n;
LL zs[N<<1],fs[N<<1];
void init()
{
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	  {
	  	zs[j-i+n]+=mp[i][j];
	  	fs[j+i]+=mp[i][j];
	  }
}
void solve()//两坐标同奇或同偶数,就不合法 
{
	LL res_1 = -100,res_2 = -100;
	int xx[2] ={0},yy[2] = {0};
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    if(i+j&1)
	    {
	    	LL t = zs[j-i+n]+fs[i+j]-mp[i][j];
	    	if(t>res_1) res_1 = t,xx[0] = i,yy[0] = j;
		}
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    if(!(i+j&1))
	    {
	    	LL t = zs[j-i+n]+fs[i+j]-mp[i][j];
	    	if(t>res_2) res_2 = t,xx[1] = i,yy[1] = j;
		}
	printf("%lld\n%d %d %d %d\n",res_1+res_2,xx[0],yy[0],xx[1],yy[1]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]);
	init();
	solve();
	return 0;
}
posted @ 2021-07-18 17:36  acmloser  阅读(38)  评论(0编辑  收藏  举报