1. 程式人生 > >51Nod——T 1631 小鯊魚在51nod小學

51Nod——T 1631 小鯊魚在51nod小學

file sta puts star size 算法題 輸入輸出 get 一次

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小學