Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:这题数据够水的(放代码)

Posted by Onlynagesha at 2017-10-03 11:38:27 on Problem 3667
In Reply To:这题数据够水的 Posted by:Onlynagesha at 2017-10-03 11:36:17
用链表维护未入住的房间,连续的合并成一个节点
写起来确实有点麻烦
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <cstdarg>
#include <climits>

#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>

#include <iostream>
#include <sstream>

#include <string>
#include <algorithm>
#include <utility>
#include <complex>
#include <functional>

using namespace std;

typedef long long int64;

const int inf = 0x3f3f3f3f;
const int64 inf64 = 0x3f3f3f3f3f3f3f3fLL;

template <class Tp>
Tp vaMax(int n, Tp v1, ...)
{
    va_list ap;
    va_start(ap, v1);
    Tp res = v1;
    for (int i = 1; i < n; i++)
    {
        Tp temp = va_arg(ap, Tp);
        if (temp > res) res = temp;
    }
    va_end(ap);
    return res;
}

template <class Tp>
Tp vaMin(int n, Tp v1, ...)
{
    va_list ap;
    va_start(ap, v1);
    Tp res = v1;
    for (int i = 1; i < n; i++)
    {
        Tp temp = va_arg(ap, Tp);
        if (temp < res) res = temp;
    }
    va_end(ap);
    return res;
}

const int maxN = 5e4 + 5;

struct Node
{
    int first;
    int len;

    Node(int f, int l): first(f), len(l) {}
};
list<Node> vacantList;

int N, M;

void init()
{
    vacantList.push_back(Node(1, N));
}

typedef list<Node>::iterator Iter;

int checkin(int d)
{
    Iter it = vacantList.begin();
    for (; it != vacantList.end(); ++it)
    {
        if (it->len >= d)
            break; // found
    }
    if (it == vacantList.end())
        return 0; // not found
    if (it->len > d)
        vacantList.insert(it, Node(it->first + d, it->len - d)); // rest part

    int res = it->first;
    vacantList.erase(it);
    return res;
}

void merge(Iter it)
{
    int ed = it->first + it->len - 1; // end position of new range
    Iter last = it; 
    for (++last; last != vacantList.end(); ++last)
    {
        if (last->first > ed + 1)
            break; // can't merge anymore
        ed = max(ed, last->first + last->len - 1);
    }
    vacantList.insert(it, Node(it->first, ed - it->first + 1));
    vacantList.erase(it, last); // clear the merged nodes
}

void checkout(int x, int d)
{
    Iter it = vacantList.begin();
    for (; it != vacantList.end(); ++it)
    {
        if (it->first > x)
        {
            if (x + d >= it->first) // x + d - 1 >= it->first - 1
            {
                it->len += (it->first - x);
                it->first = x;
                it->len = max(it->len, d);
                merge(it);
            }
            else 
            {
                vacantList.insert(it, Node(x, d));
            }
            return;
        }
        else if (x >= it->first && x <= it->first + it->len) // x <= (first + len - 1) + 1
        {
            it->len = max(it->len, d + x - it->first);
            merge(it);
            return;
        }
    }
    vacantList.push_back(Node(x, d)); // it == end()
}

int main()
{
    scanf("%d%d", &N, &M);
    init();
    while (M--)
    {
        int cmd, x, d;
        scanf("%d", &cmd);
        if (cmd == 1)
        {
            scanf("%d", &d);
            printf("%d\n", checkin(d));
        }
        else
        {
            scanf("%d%d", &x, &d);
            checkout(x, d);
        }
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator