list的使用 CCF 201403-2 窗口

有什么能比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;
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值