​【CCF-CSP】201403-2 窗口​

题目

先给出 n 个窗口(窗口的左边范围),之后有 m 次点击(即一个坐标),每次点击输出当前坐标最顶层的窗口序号,同时将当前窗口移动到最顶层。

分析

用链表存窗口的优先级,每次点击按照优先级遍历所有窗口,看自己在哪个窗口的范围,并将找到的窗口移动到链表的前端。

#include <bits/stdc++.h>
using namespace std;
#define d(x) cout<<x<<endl

typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 20;

int n, m;

struct node {
int a, b, c, d;
} arr[N];

int main() {
scanf("%d%d", &n, &m);
list<int> l;
for (int i = 1; i <= n; i++) {
scanf("%d%d%d%d", &arr[i].a, &arr[i].b, &arr[i].c, &arr[i].d);
l.push_front(i);
}
while (m--) {
int x, y, flag = 0;
scanf("%d%d", &x, &y);
for (auto it = l.begin(); it != l.end(); it++) {
if (x >= arr[*it].a && x <= arr[*it].c && y >= arr[*it].b && y <= arr[*it].d) {
l.push_front(*it); l.erase(it);
printf("%d\n", *it); flag = 1; break;
}
}
if (flag == 0) printf("IGNORED\n");
}
return 0;
}