Codeforces Round #264 (Div. 2) C. Gargari and Bishops 主教攻击

来源:互联网 发布:陪你读书javascript 编辑:程序博客网 时间:2024/06/05 08:38

http://codeforces.com/contest/463/problem/C

在一个n∗n的国际象棋的棋盘上放两个主教,要求不能有位置同时被两个主教攻击到,然后被一个主教攻击到的位置上获得得分。求得分的最大值。

黑白格分开考虑最大值即可,注意全0情况。

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <string>#include <queue>#include <vector>#include<set>#include <iostream>#include <algorithm>using namespace std;#define RD(x) scanf("%d",&x)#define RD2(x,y) scanf("%d%d",&x,&y)#define clr0(x) memset(x,0,sizeof(x))typedef long long LL;int n;const int maxn = 2500;LL s[maxn][maxn];LL sum[maxn*2],cha[maxn*2];struct node{    LL fen;    int x,y;}a[maxn*maxn/2],b[maxn*maxn/2];int main(){    RD(n);    clr0(sum),clr0(cha);    for(int i = 1;i <= n;++i)    for(int j = 1;j <= n;++j){        scanf("%I64d",&s[i][j]);        sum[i+j] += s[i][j];        cha[j-i+maxn] += s[i][j];    }    int cnt_a = 0,cnt_b = 0;    for(int i = 1;i <= n;++i)    for(int j = 1;j <= n;++j){        LL fen = sum[i+j] + cha[j-i+maxn] - s[i][j];        if((i+j)&1){            a[cnt_a++] = (node){fen,i,j};        }        else{            b[cnt_b++] = (node){fen,i,j};        }    }    LL ans_a = -1,ans_b = -1;    int x1,y1,x2,y2;    for(int i = 0;i < cnt_a;++i){        if(ans_a < a[i].fen){            ans_a = a[i].fen;            x1 = a[i].x,y1 = a[i].y;        }    }    for(int i = 0;i < cnt_b;++i){        if(ans_b < b[i].fen){            ans_b = b[i].fen;            x2 = b[i].x,y2 = b[i].y;        }    }    printf("%I64d\n",ans_a+ans_b);    printf("%d %d %d %d\n",x1,y1,x2,y2);    return 0;}

0 0