zoj 3581 A Simple Test 模拟题
模拟题,很暴力的水过,不过可以用并查集优化
注意两个重点是可以的
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int N = 500; int ar[N][N]; struct Point{ int x,y; }a,b,ra,rb; bool ok(Point a,Point b){ if(a.x==b.x) { for(int i=min(a.y,b.y);i<=max(a.y,b.y);i++) if(ar[a.x][i]) return 0; }else if(a.y==b.y){ for(int i=min(a.x,b.x);i<=max(a.x,b.x);i++) if(ar[i][a.y]) return 0; } return 1; } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ memset(ar,0,sizeof(ar)); int num; scanf("%d",&num); while(num--){ scanf("%d%d",&a.x,&a.y); ar[a.x][a.y]=1; } int Q,ans=60; scanf("%d",&Q); //for(int i=0;i<n;i++){ // for(int j=0;j<m;j++) // cout<<ar[i][j]<<" "; // cout<<endl; //} while(Q--){ scanf("%d%d%d%d",&a.x,&a.y,&b.x,&b.y); if(a.x<0||a.y<0||b.x<0||b.y<0 || a.x>=n||a.y>=m||b.x>=n||b.y>=m ||!ar[a.x][a.y]||!ar[b.x][b.y]) ans--; else{ ar[a.x][a.y]=0; ar[b.x][b.y]=0; int flag=0; for(int i=0;i<n;i++){ ra.x=i; ra.y=a.y; rb.x=i; rb.y=b.y; if(ok(ra,rb)&&ok(a,ra)&&ok(rb,b)){ flag=1; } } for(int i=0;i<m;i++){ ra.x=a.x; ra.y=i; rb.x=b.x; rb.y=i; if(ok(ra,rb)&&ok(a,ra)&&ok(rb,b)){ flag=1; } } if(flag==1) { ans+=2; } else { ans--; ar[a.x][a.y]=1; ar[b.x][b.y]=1; } } printf("%d\n",ans); } } }