結果

問題 No.960 マンハッタン距離3
ユーザー kotatsugamekotatsugame
提出日時 2019-12-21 23:23:58
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,187 bytes
コンパイル時間 776 ms
コンパイル使用メモリ 77,588 KB
実行使用メモリ 6,988 KB
最終ジャッジ日時 2024-09-13 13:13:04
合計ジャッジ時間 9,980 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 201 WA * 15
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:34:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   34 | main()
      | ^~~~

ソースコード

diff #

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<map>
using namespace std;
long W,H;
int N;
long X[1<<17],Y[1<<17];
int check(long x,long y)
{
	if(!(1<=x&&x<=W&&1<=y&&y<=H))return 0;
	int dis=abs(X[0]-x)+abs(Y[0]-y);
	for(int i=1;i<N;i++)
	{
		int now=abs(X[i]-x)+abs(Y[i]-y);
		if(dis!=now)return 0;
	}
	return 1;
}
long XX[1<<17],YY[1<<17];
long ans;
void rotate(long now)
{
	ans=max(ans,now);
	for(int i=0;i<N;i++)
	{
		int x=X[i],y=Y[i];
		X[i]=H-y+1;
		Y[i]=x;
	}
	swap(H,W);
}
main()
{
	cin>>W>>H>>N;
	for(int i=0;i<N;i++)cin>>X[i]>>Y[i];
	for(int i=1;i<N;i++)
	{
		if((X[0]+Y[0])%2!=(X[i]+Y[i])%2)
		{
			cout<<0<<endl;
			return 0;
		}
	}
	long now;
	for(int ccc=0;ccc<4;rotate(now),ccc++)
	{
		now=0;
		long mx=1e18,Mx=-1e18,my=1e18,My=-1e18;
		long mxpy=1e18,Mxpy=-1e18,mxmy=1e18,Mxmy=-1e18;
		for(int i=0;i<N;i++)
		{
			mx=min(mx,X[i]);
			Mx=max(Mx,X[i]);
			my=min(my,Y[i]);
			My=max(My,Y[i]);
			mxpy=min(mxpy,X[i]+Y[i]);
			Mxpy=max(Mxpy,X[i]+Y[i]);
			mxmy=min(mxmy,X[i]-Y[i]);
			Mxmy=max(Mxmy,X[i]-Y[i]);
		}
		if(N==2)
		{
			if(mxpy==Mxpy)
			{
				now=mx*my+(W-Mx+1)*(H-My+1)+(Mx-mx)-1;
			}
			else if(Mx-mx<My-my)
			{
				now=W;
			}
			continue;
		}
		if(mxpy==Mxpy)
		{
			now=mx*my+(W-Mx+1)*(H-My+1);
			continue;
		}
		bool triangle=true;
		for(int i=0;i<N;i++)
		{
			triangle&=X[i]+Y[i]==Mxpy||X[i]-Y[i]==mxmy;
		}
		if(triangle)
		{
			//    /\
			//   /  \
			//  /    \
			// /
			//
			now+=my;
		}
		bool horizontalB=Mxmy-mxmy>=Mxpy-mxpy;
		for(int i=0;i<N;i++)
		{
			horizontalB&=X[i]-Y[i]==Mxmy||X[i]-Y[i]==mxmy;
		}
		if(horizontalB)
		{
			// A
			// \    \
			//  \    \
			//   \    \
			// 
			// B
			//   /   /
			//  /   /
			// /   /
			//
			now+=-(Mxpy-mxpy)/2+(Mxmy-mxmy)/2+1;
			if(triangle)now--;
		}
		if(triangle||horizontalB)continue;
		bool corner=Mxpy-mxpy>=Mxmy-mxmy;
		for(int i=0;i<N;i++)
		{
			corner&=X[i]+Y[i]==Mxpy||X[i]+Y[i]==mxpy||X[i]-Y[i]==Mxmy;
		}
		if(corner)
		{
			now=1;
			continue;
		}
		bool square=Mxpy-mxpy==Mxmy-mxmy;
		for(int i=0;i<N;i++)
		{
			square&=X[i]+Y[i]==Mxpy||X[i]+Y[i]==mxpy||X[i]-Y[i]==Mxmy||X[i]-Y[i]==mxmy;
		}
		if(square)now=1;
	}
	cout<<ans<<endl;
}
0