有什么能比WA了快一个小时结果发现是自己的ignore拼错了更让人无语……简直要吐血,一直返回错误搞得我都要怀疑人生了,虽然说我快一个月没写过代码了……可是,居然菜到连第二题都写不出来了嘛,只想嘤嘤嘤
不过通过这道题好好看了一下list的各种操作 >v<
------------------------------------------------------------------------------------------------------------------------------------
补充 list:
1、头文件
#include<list>
2、添加删除操作
list.push_front(x) //从前面插入元素x
list.push_back(x) //从后面插入元素x
list.pop_front() //删除最前面的元素
list.pop_back() //删除最后面的元素
list.erase(it) //删除迭代器it位置的元素
list.unique() //删除相邻的重复元素
3、基本操作
list.front() //返回链表第一个元素
list.back() //返回链表最后一个元素
list.empty() //判断链表是否为空,若链表为空返回true,链表不为空返回true
list.size() //返回链表中元素个数
list.clear() //清除链表a中元素
--------------------------------------------------------------------------------------------我只是分割线哇
两种方法:
1、使用STL中的list(为什么会想到链表:这道题的操作就是不断地抽取、插入)
2、直接按题意模拟
方法一:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<list>
#define maxn 15
using namespace std;
struct node
{
int id;
int x1,x2,y1,y2;
}c[maxn];
list<node>l;
int main(void)
{
int n,m;
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d%d%d%d",&c[i].x1,&c[i].y1,&c[i].x2,&c[i].y2);
c[i].id=i;
l.push_front(c[i]);//这样插相当于直接按照优先级插好了
}
for(int i=1;i<=m;++i)
{
bool flag=false;
scanf("%d%d",&x,&y);
list<node>::iterator it;
for(it=l.begin();it!=l.end();++it)
{
node mid=*it;
if(x>=mid.x1&&x<=mid.x2&&y>=mid.y1&&y<=mid.y2)
{
flag=true;
printf("%d\n",mid.id);
l.erase(it);
l.push_front(mid);
break;
}
}
if(!flag)
printf("IGNORED\n");
}
return 0;
}
方法二:
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 3000
using namespace std;
int vis[maxn][maxn];
int lx[15],ly[15],rx[15],ry[15];
int main(void)
{
int n,m;
int x1,y1,x2,y2;
int x,y;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis)); //vis[i][j]直接更新为(i,j)所在的优先级最高的窗口
for(int k=1;k<=n;++k)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
lx[k]=x1;ly[k]=y1;//保存编号窗口的大小范围
rx[k]=x2;ry[k]=y2;
for(int i=x1;i<=x2;++i)
{
for(int j=y1;j<=y2;++j)
{
vis[i][j]=k;
}
}
}
//
for(int i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
if(vis[x][y]==0)
{
printf("IGNORED\n");
continue;
}
int id=vis[x][y];
for(int j=lx[id];j<=rx[id];++j)
{
for(int k=ly[id];k<=ry[id];++k)
{
vis[j][k]=id;
}
}
printf("%d\n",id);
}
return 0;
}