描述
题解
暴力解题就能通过,数据比较水,感觉我的代码有些麻烦,有很大的优化空间。
这里要说的是,其实年月日可以转化为一个独有的序号转存,这个序号依然保持原来日期的对比关系。
比如说,将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;
}