結果
問題 | No.960 マンハッタン距離3 |
ユーザー |
|
提出日時 | 2019-12-21 23:23:06 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,186 bytes |
コンパイル時間 | 838 ms |
コンパイル使用メモリ | 77,460 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-13 13:12:40 |
合計ジャッジ時間 | 10,300 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 200 WA * 16 |
コンパイルメッセージ
main.cpp:34:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type] 34 | main() | ^~~~
ソースコード
#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 horizontalA=Mxpy-mxpy>=Mxmy-mxmy; for(int i=0;i<N;i++) { horizontalA&=X[i]+Y[i]==Mxpy||X[i]+Y[i]==mxpy; } if(horizontalA) { // A // \ \ // \ \ // \ \ // // B // / / // / / // / / // now+=(Mxpy-mxpy)/2-(Mxmy-mxmy)/2+1; if(triangle)now--; } if(triangle||horizontalA)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; }