51Nod——T 1631 小鲨鱼在51nod小学

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod——T 1631 小鲨鱼在51nod小学相关的知识,希望对你有一定的参考价值。

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1631

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
技术分享 收藏
技术分享 关注
鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学。并依靠算法方面的特长,在班里担任了许多职务。
 
每一个职务都有一个起始时间A和结束时间B,意为小鲨鱼在[A, B]时间内,担任了某职务(inclusively)。
 
现在给定小鲨鱼的职务履历表,你可以高效的给出小鲨鱼在某天担任了哪些职务吗?
 
p.s. 由于小鲨鱼担任的职务太多,所有任期小于一个自然月的职务都忽略不计。(如1月1日~2月1日为一个自然月,即月份加1)
 
p.p.s. 输入数据保证小鲨鱼同时不担任超过200种职务。(牛!)
 
p.p.p.s 输入的日期均为合法日期,范围在2000年01月01日~2999年12月31日。
 
p.p.p.p.s巨大的输入输出,推荐使用scanf/printf,编译器推荐使用Virtual C++
Input
第一行为一个整数n,代表小鲨鱼担任过N种职务。(1 <= n <= 10^5)
接下来的n行,每一行为七个整数,y0, m0, d0, y1, m1, d1, x。意为在<y0, m0, d0>到<y1, m1, d1>时间内,小鲨鱼担任了职务x。(1 <= x <= 10^9)
给定的时间皆合法,且起始日期小于或等于截止日期。职务x是唯一的。

接下来是一个整数q,代表q次查询。(1 <= q <= 10^4)
接下来的q行,每一行为三个整数<y, m, d>,代表查询的日期。时间皆合法。
Output
每一次查询输出一行结果。
首先输出一个整数n,代表此时小鲨鱼担任的职务数。(n可以为0)
接下来是n个整数,代表小鲨鱼担任的职务。职务列表保持升序。
Input示例
4
2000 01 01    2000 01 01    111
2000 01 02    2001 02 02    222
2000 01 28    2000 02 29    333
2000 01 29    2000 02 28    444
4
2000 01 01
2000 01 02
2000 01 28
2000 02 29
Output示例
0
1 222
2 222 333
2 222 333



贪心+模拟
只忽略小于一个自然月、然后。。等于的也忽略了WA半天、
 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 inline void read(int &x)
 5 {
 6     x=0; register char ch=getchar();
 7     for(; ch>9||ch<0; ) ch=getchar();
 8     for(; ch>=0&&ch<=9; ch=getchar()) x=x*10+ch-0;
 9 }
10 const int N(1e5+5);
11 int y0,m0,d0,y1,m1,d1,k;
12 int cnt,tmp,ans[N];
13 struct Work {
14     int ly,lm,ld,ry,rm,rd,kind;
15     Work(int ly=0,int lm=0,int ld=0,int ry=0,int rm=0,int rd=0,int kind=0):
16         ly(ly),lm(lm),ld(ld),ry(ry),rm(rm),rd(rd),kind(kind){}
17     bool operator < (const Work &x)const
18     {
19         if(ly!=x.ly) return ly<x.ly;
20         else if(lm!=x.lm) return lm<x.lm;
21         else if(ld!=x.ld) return ld<x.ld;
22         else if(ry!=x.ry) return ry<x.ry;
23         else if(rm!=x.rm) return rm<x.rm;
24         else if(rd!=x.rd) return rd<x.rd;
25     }
26 }job[N<<1];
27 
28 inline bool check()
29 {
30     if(y0==y1) return (m0+1==m1&&d0>d1)||m0==m1;
31     else return (y0+1==y1&&m0==12&&m1==1&&d0>d1);
32 }
33 inline bool if_break(Work x)
34 {
35     if(x.ly>y0) return 1;
36     else if(x.ly==y0&&x.lm>m0) return 1;
37     else if(x.ly==y0&&x.lm==m0&&x.ld>d0) return 1;
38     return 0;
39 }
40 inline bool judge(Work x)
41 {
42     if(x.ry<y0) return 0;
43     else if(x.ry==y0)
44            if(x.rm<m0) return 0;
45            else if(x.rm==m0)
46                      if(x.rd<d0) return 0;
47     return 1;
48 }
49 
50 int Presist()
51 {
52     int n,q; read(n);
53     for(int i=1; i<=n; ++i)
54     {
55         read(y0),read(m0),read(d0);
56         read(y1),read(m1),read(d1); read(k);
57         if(!check()) job[++cnt]=Work(y0,m0,d0,y1,m1,d1,k);
58     }
59     std::sort(job+1,job+cnt+1);
60     for(read(q); q--; tmp=0)
61     {
62         read(y0),read(m0),read(d0);
63         for(int i=1; i<=cnt; ++i)
64         {
65             if(if_break(job[i])) break;
66             if(judge(job[i])) ans[++tmp]=job[i].kind;
67         }
68         if(!tmp) puts("0");
69         else
70         {
71             printf("%d ",tmp); std::sort(ans+1,ans+tmp+1);
72             for(int i=1; i<tmp; ++i) printf("%d ",ans[i]);
73             printf("%d\n",ans[tmp]);
74         }
75     }
76     return 0;
77 }
78 
79 int Aptal=Presist();
80 int main(int argc,char*argv[]){;}

 

以上是关于51Nod——T 1631 小鲨鱼在51nod小学的主要内容,如果未能解决你的问题,请参考以下文章

51nod1717 好数

51nod 1824染色游戏

51nod 1831:小C的游戏

51nod 1354:选数字

51nod 1013快速幂 + 费马小定理

51Nod——T 1686 第K大区间