zoukankan      html  css  js  c++  java
  • hdu 4022map和list等数据结构的应用

    这题还是挺好的,想了好久才想出做法。做法的大体思想其实就是暴力删点,用了一个布尔数组(deleted)来记录在执行一个请求前某点是否已被删除(所以在点结构体中加了一个变量id以唯一标识一个点)。我是用了两个链表存了两份点(lx, ly),一份先按x再按y排序,另一份先按y再按x排序。然后用一个mapx存下lx中不同x值开始的位置。(同理得mapy)。对于一个删除x=d的请求,可以直接从mapx中读出x=d在链表中的起始位置,然后一个个地删,一边删一边记录在deleted数组中就可以了。同理可以处理y=d的情况。

    这题最让我记忆深刻的地方是我在打代码的时候有个地方犯了一个小错误死循环了没输出结果,然后调试,发现map里存的iterator都不对,各种稀奇古怪的问题,最后才发现那是eclipse的bug,无语了。

    /*
     * hdu 4022/win.cpp
     * Created on: 2012-11-9
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    const int MAXN = 100100;
    typedef struct MP{
        int x, y;
        int id;
    }MP;
    MP mp[MAXN];
    bool deleted[MAXN];
    inline bool cmpx(const MP &m1, const MP &m2) {
        if(m1.x == m2.x) {
            return m1.y < m2.y;
        }
        return m1.x < m2.x;
    }
    inline bool cmpy(const MP &m1, const MP &m2) {
        if(m1.y == m2.y) {
            return m1.x < m2.x;
        }
        return m1.y < m2.y;
    }
    map<int, list<MP>::iterator> mapx, mapy;
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        int N, M, o, d, temp;
        while(scanf("%d%d", &N, &M) == 2) {
            if(N == 0 || M == 0) {
                break;
            }
            for(int i = 0; i < N; i++) {
                scanf("%d%d", &mp[i].x, &mp[i].y);
                mp[i].id = i;
            }
            list<MP> lx, ly;
            sort(mp, mp + N, cmpx);
            copy(mp, mp + N, back_inserter(lx));
            sort(mp, mp + N, cmpy);
            copy(mp, mp + N, back_inserter(ly));
            list<MP>::iterator it = lx.begin();
            it = lx.begin();
            mapx.clear();
            while(it != lx.end()) {
                temp = (*it).x;
                if(mapx.count(temp) == 0) {
                    mapx[temp] = it;
                }
                it++;
            }
            it = ly.begin();
            mapy.clear();
            while(it != ly.end()) {
                temp = (*it).y;
                if(mapy.count(temp) == 0) {
                    mapy[temp] = it;
                }
                it++;
            }
            memset(deleted, false, sizeof(deleted));
            for(int i = 0; i < M; i++) {
                scanf("%d%d", &o, &d);
                int ans = 0;
                if(o == 0) {
                    if(mapx.count(d) > 0) {
                        list<MP>::iterator it = mapx[d];
                        while(it != lx.end() && (*it).x == d) {
                            if(!deleted[(*it).id]) {
                                deleted[(*it).id] = true;
                                ans++;
                            }
                            it++;
                        }
                    }
                }else {
                    if(mapy.count(d) > 0) {
                        list<MP>::iterator it = mapy[d];
                        while(it != ly.end() && (*it).y == d) {
                            if(!deleted[(*it).id]) {
                                deleted[(*it).id] = true;
                                ans++;
                            }
                            it++;
                        }
                    }
                }
                printf("%d\n", ans);
            }
            putchar('\n');
        }
        return 0;
    }
  • 相关阅读:
    spring cloud图形化dashboard是如何实现指标的收集展示的
    浮躁的我们
    c/c++学习系列之内存对齐
    c/c++学习系列之取整函数,数据宽度与对齐
    c/c++学习系列之memset()函数
    c/c++学习系列之putchar、getchar、puts、gets的运用
    c#学习系列之静态类,静态构造函数,静态成员,静态方法(总之各种静态)
    c#学习系列之字段(静态,常量,只读)
    C#中MessageBox用法大全(附效果图)<转>
    c#学习系列之Application.StartupPath的用法(美女时钟的做法)
  • 原文地址:https://www.cnblogs.com/moonbay/p/2766546.html
Copyright © 2011-2022 走看看