1. 程式人生 > >Sonya and Matrix CodeForces - 1004D

Sonya and Matrix CodeForces - 1004D

http://codeforces.com/contest/1004/problem/D

 

題意:網格圖給定到中心點的曼哈頓距離陣列, 求該圖n,m及中心點位置

 

首先可以觀察到距離最大值mx一定在某個角上, 可將它調整到位置(n,m)

設中心點(x, y) 則可以得到 n-x+m-y=mx

再注意到假若圖無限大, 則對每個距離d的取值一定有4*d個, 即第一個取值數<4*d的d可以調整為中心點的x座標

然後就可以暴力列舉因子判斷了

 

 

#include <iostream>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using
namespace std; const int N = 2e6+10, INF = 0x3f3f3f3f; int a, b, x, y, t; int c[N], cnt[N]; int main() { scanf("%d", &t); REP(i,1,t) { scanf("%d", &x); ++c[x], b = max(b, x); } REP(i,1,t) if (c[i]!=4*i) {x=i;break;} REP(i,1,t) if (t%i==0) { int n=i, m=t/i; y
= n+m-x-b; if (abs(n-x)+abs(m-y)!=b) continue; REP(i,0,n+m) cnt[i]=0; REP(i,1,n) REP(j,1,m) ++cnt[abs(x-i)+abs(y-j)]; int ok = 1; REP(i,0,n+m) if (cnt[i]!=c[i]) {ok=0;break;} if (ok) { printf("%d %d\n%d %d\n",n,m,x,y); return 0; } } puts(
"-1"); }