ACM模版

描述

题解

暴力解题就能通过,数据比较水,感觉我的代码有些麻烦,有很大的优化空间。

这里要说的是,其实年月日可以转化为一个独有的序号转存,这个序号依然保持原来日期的对比关系。
比如说,将2001年1月1日存为:20010101,(2001*10000 + 1 * 100 + 1),这样子,两个日期间的对比关系用此序号对比依然成立。

也可以使用<set>集合优化。

代码

#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 1e5 + 10;

struct task
{
    int y0, m0, d0;
    int y1, m1, d1;
    int number;
} Task[MAXN];

int res[MAXN];  // 存储任务序号 res[0] 存储任务个数

template <class T>
inline void scan_d(T &ret)
{
    char c;
    ret = 0;
    while ((c = getchar()) < '0' || c > '9');
    while (c >= '0' && c <= '9')
    {
        ret = ret * 10 + (c - '0'), c = getchar();
    }
    return ;
}

bool cmp(task a, task b)
{
    return a.number < b.number;
}

int main(int argc, const char * argv[])
{
// freopen("/Users/zyj/Desktop/input.txt", "r", stdin);

    int n;
    scan_d(n);

    int key = 0;
    int y0, y1, m0, m1, d0, d1;
    int number;
    for (int i = 0; i < n; i++)
    {
        scan_d(y0);
        scan_d(m0);
        scan_d(d0);
        scan_d(y1);
        scan_d(m1);
        scan_d(d1);
        scan_d(number);
        if ((y0 == y1 && m0 == m1) || (y0 == y1 && m0 == m1 - 1 && d0 > d1) || (y0 == y1 - 1 && m0 == 12 && m1 == 1 && d0 > d1))
        {
            continue;
        }
        Task[key].y0 = y0;
        Task[key].m0 = m0;
        Task[key].d0 = d0;
        Task[key].y1 = y1;
        Task[key].m1 = m1;
        Task[key].d1 = d1;
        Task[key++].number = number;
    }
    sort(Task, Task + key, cmp);

    int q;
    scan_d(q);

    int y, m, d;
    for (int i = 0; i < q; i++)
    {
        res[0] = 0;
        scan_d(y);
        scan_d(m);
        scan_d(d);
        for (int i = 0; i < key; i++)
        {
            if (y >= Task[i].y0 && y <= Task[i].y1)
            {
                if ((y == Task[i].y0 && m < Task[i].m0) || (y == Task[i].y0 && m == Task[i].m0 && d < Task[i].d0) || (y == Task[i].y1 && m > Task[i].m1) || (y == Task[i].y1 && m == Task[i].m1 && d > Task[i].d1))
                {
                    continue;
                }
                res[0]++;
                res[res[0]] = Task[i].number;
            }
        }
        for (int i = 0; i < res[0]; i++)
        {
            printf("%d ", res[i]);
        }
        printf("%d\n", res[res[0]]);
    }

    return 0;
}