暂无java代码,以下是参考的C++代码的注释:
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define SF scanf
#define PF printf
#define MM(a,v) memset(a,v,sizeof(a))
#define REP(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define REPD(i,a,b) for(int (i)=(a);(i)>(b);(i)--)
#define N 60009
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define bug puts("bug")
using namespace std;
vector Lx[N],Ly[N]; // Lx[i]表示第i行的所有障碍物的列坐标
int n,m,k;
int fin(int x,int y) // 判断(x,y)处是否存在障碍物
{
int l=0,r=Lx[x].size()-1,mid,ans=0;
while(l<=r)
{
mid = (l+r)>>1;
if(Lx[x][mid]<=y)
{
ans = mid;
l = mid+1;
}else
{
r = mid-1;
}
}
if(Lx[x][ans]==y&&Lx[x][ans+1]==y+2) return 1; // 如果Lx[x][ans]+1 = y,说明(x,y)处存在障碍物,返回1
return 0;
}
int solve()
{
int ret = 0;
REP(i,1,n)
{
REP(j,1,(int)Lx[i].size())
{
if(Lx[i][j]-Lx[i][j-1]>2)
ret++; // 如果两个障碍物间隔超过2,对答案加1
}
}
REP(i,1,m)
{
REP(j,1,(int)Ly[i].size())
{
if(Ly[i][j]-Ly[i][j-1]>2)
ret++; // 如果两个障碍物间隔超过2,对答案加1
if(Ly[i][j]-Ly[i][j-1]==2)
{
if(fin(Ly[i][j]-1,i-1))
ret++; // 如果第i行的第j-1、j列之间距离为2,且第i-1行的第j-1列有障碍物,对答案加1
}
}
}
return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
SI(n);SI(m);SI(k);
int a,b;
REP(i,0,k)
{
SI(a);SI(b);
Lx[a].push_back(b);
Ly[b].push_back(a);
}
n++,m++;
REP(i,1,n) Lx[i].push_back(0),Lx[i].push_back(m);
REP(i,1,m) Ly[i].push_back(0),Ly[i].push_back(n);
REP(i,1,n) sort(Lx[i].begin(),Lx[i].end());
REP(i,1,m) sort(Ly[i].begin(),Ly[i].end());
PF("%d\n",solve());
return 0;