题目描述一个城市遭到了M次轰炸每次都炸了一个每条边都与边界平行的矩形在轰炸后有N个关键点指挥官想知道它们有没有受到过轰炸如果有被炸了几次最后一次是第几轮。输入第一行两个整数:MN以下M行每行四个整数:x1、y1、x2、y2表示被轰炸的矩形的左上角坐标和右下角坐标比如1 3 7 10就表示被轰炸的地方是从13到710的矩形。再以下N行每行两个整数表示这个关键点的坐标。输出共N行每行第一个字符为YES
#include<bits/stdc++.h> using namespace std; const int maxn = 2e3+5; int n,m,cnt; int vis[maxn][maxn]; struct node{ int x1,x2,y1,y2; }a[maxn]; struct node1{ int x,y,num; }b[maxn]; int main(){ scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2); } for(int i=1;i<=n;i++) { scanf("%d%d",&b[i].x,&b[i].y); b[i].num=i; } for(int i=m;i>=1;i--) { for(int j=1;j<=n;j++) { if(b[j].x>=a[i].x1&&b[j].x<=a[i].x2&&b[j].y>=a[i].y1&&b[j].y<=a[i].y2) { vis[b[j].x][b[j].y]++; b[j].x=-1; } } } for(int i=1;i<=n;i++) { if(b[i].x==-1) { if(vis[b[i].x+1][b[i].y]==0||vis[b[i].x][b[i].y+1]==0||vis[b[i].x-1][b[i].y]==0||vis[b[i].x][b[i].y-1]==0) printf("YES 0 0\n"); else { cnt=0; for(int j=1;j<=m;j++) { if(vis[b[i].x][b[i].y]>0&&b[i].x>=a[j].x1&&b[i].x<=a[j].x2&&b[i].y>=a[j].y1&&b[i].y<=a[j].y2) { cnt++; if(vis[b[i].x][b[i].y]==1) printf("YES %d %d\n",cnt,j); vis[b[i].x][b[i].y]=0; } } } } else printf("NO\n"); } return 0;
原文地址: https://www.cveoy.top/t/topic/fyJC 著作权归作者所有。请勿转载和采集!