51Nod——T 1631 小鯊魚在51nod小學
阿新 • • 發佈:2017-09-28
file sta puts star size 算法題 輸入輸出 get 一次
,推薦使用scanf/printf,編譯器推薦使用Virtual C++
Input
Output
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巨大的輸入輸出第一行為一個整數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>,代表查詢的日期。時間皆合法。
每一次查詢輸出一行結果。 首先輸出一個整數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 29Output示例
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小學