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;
}