CCF 201403-2 窗口 C++ pay attention

在这里插入图片描述
在这里插入图片描述
思路:对每个窗口,要同时设置一个编号id,和一个表示次序的num。编号是不变的,是为了最终输出;次序是要每次更新的,每次被点击的窗口(通过set排序选num最大的为被点击的)要到最上面,被点击窗口原来上面的那些窗口则要下降一级。由于可能同时点击了多个窗口,所以要对这些窗口的上下次序排序,选择最上面的窗口。

#include <iostream>
#include <algorithm>
#include <set>
struct point{
	int x1,y1,x2,y2;
	int id,num;
};
bool click(point p,int x,int y)
{
	if(p.x1<=x&&p.x2>=x&&p.y1<=y&&p.y2>=y)
	     return true;
	else
	     return false;
}
using namespace std;
int main()
{
	int n,m,x,y;
	cin >> n >> m;
	point a[n];
	for(int i=0;i<n;i++)
	{
		cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2;
		a[i].id=a[i].num=i+1;
	}
	for(int i=0;i<m;i++)
	{
		set<int> s;
		cin >> x >> y;
		for(int j=0;j<n;j++)//检测被点击到的窗口编号 
		{
			if(click(a[j],x,y))
			{
				s.insert(a[j].num);//排序找到被点击的中最上层的窗口 
			}
		}
		if(s.empty()) cout << "IGNORED" << endl;//没点击窗口 
		else
		{
			for(int k=0;k<n;k++)
			{
				set<int>::iterator it=s.end();
				it--;
				if(a[k].num==*it)
				{
					cout << a[k].id << endl;//输出被点击窗口的编号
					for(int j=0;j<n;j++)
					{
						if(a[j].num>a[k].num)
						{
							a[j].num--;//在它上面的窗口次序都降一级 
						}
					}
					a[k].num=n;//将其挪动到最上面(序号最大) 
					break; 
				}
			}
		}
	}
	return 0;
}

注意set没有s[s.size()-1]这种用法,取值必须用迭代器。但是s.size()是有的。
测试用例:

3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值