原文鏈接
原題鏈接
思路
給定一個點,很容易判斷是否屬於某個窗口。在這裏,用結構體存放窗口的信息,包括窗口id和窗口排列的優先級,用z值的大小表示,z值越大,就越排在vector的前面。
從最上面的窗口開始判斷點擊的位置是否屬於該窗口,一旦查詢到屬於某個窗口,則將該窗口的z值變成最大的。這裏用++n保證,最新點擊的z值是最大的。
代碼
#include <bits/stdc++.h>
using namespace std;
struct node{
int id;
int x1,y1,x2,y2;
int z;//z值越大,則越靠前
node(int i,int x11,int y11,int x22,int y22,int zz){
id = i;
x1 = x11;
y1 = y11;
x2 = x22;
y2 = y22;
z = zz;
}
};
bool cmp(const node&a,const node &b){
return a.z>b.z;
}
bool isIn(int x,int y,node w){
//判斷(x,y)是否在w窗口中
if(x >= w.x1 && x <= w.x2 && y >= w.y1 && y <= w.y2){
return true;
}
return false;
}
int main(){
vector<node> v;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
v.push_back(node{i,x1,y1,x2,y2,i});
}
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
sort(v.begin(),v.end(),cmp);//每次都保證z大的在最上面
bool isfind = false;
for(int i=0;i<v.size();i++){
if(isIn(x,y,v[i])){
//在某個窗口上
v[i].z = ++n; //優先級加一
cout<<v[i].id<<endl;
isfind = true;
break ;
}
}
if(isfind == false){
cout<<"IGNORED"<<endl;
}
}
}