暂无java代码,以下是参考的C++代码的注释:

#include #include #include #include #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;

#include iostream#include cmath#include cstdio#include cstring#include algorithm#include queue#include stack#include map#include set#include list#include deque#include string #define LL long long#defi

原文地址: https://www.cveoy.top/t/topic/e4CQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录