糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 51nod-1631-小鲨鱼在51nod小学

51nod-1631-小鲨鱼在51nod小学

时间:2020-02-26 16:30:38

相关推荐

51nod-1631-小鲨鱼在51nod小学

鲨鱼巨巨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。意为在 到 时间内,小鲨鱼担任了职务x。(1 <= x <= 10^9)

给定的时间皆合法,且起始日期小于或等于截止日期。职务x是唯一的。

接下来是一个整数q,代表q次查询。(1 <= q <= 10^4)

接下来的q行,每一行为三个整数 ,代表查询的日期。时间皆合法。

Output

每一次查询输出一行结果。

首先输出一个整数n,代表此时小鲨鱼担任的职务数。(n可以为0)

接下来是n个整数,代表小鲨鱼担任的职务。职务列表保持升序。

Sample 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

Sample Output

0

1 222

2 222 333

2 222 333

线段树卡过(800+ms),暴力思路待填坑。

但是有一些细节需要处理。

比如:自然月?

其实我看了上面给的例子也没看懂,然后到处找定义,再然后就懵逼了…(所以有谁可以讲清楚一点吗QAQ)

然后参考某处题解datehash函数里的注释,每个月都当作31天做,然后判断。

详见代码。

#include<cstdio>#include<vector>#include<algorithm>#define maxn 372000#define maxm 205using namespace std;int n,q,ans[maxm],cnt;struct node{int l,r;vector<int> a;}tree[maxn*4+5];void Build(int i,int l,int r){tree[i].l=l,tree[i].r=r;if(l==r) return;int mid=(l+r)/2;Build(i*2,l,mid);Build(i*2+1,mid+1,r);}int getnum(int y,int m,int d){return (y-2000)*372+(m-1)*31+d;}void Update(int i,int l,int r,int x){if(l>tree[i].r||r<tree[i].l) return;if(l<=tree[i].l&&tree[i].r<=r) {tree[i].a.push_back(x);return;}Update(i*2,l,r,x);Update(i*2+1,l,r,x);}void Count(int i,int x){for(int j=0;j<tree[i].a.size();j++) ans[++cnt]=tree[i].a[j];if(tree[i].l==tree[i].r) return;int mid=(tree[i].l+tree[i].r)/2;if(x<=mid) Count(i*2,x);else Count(i*2+1,x);}int main(){Build(1,1,maxn);scanf("%d",&n);for(int i=1;i<=n;i++){int y1,m1,d1,y2,m2,d2,x;scanf("%d%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2,&x);int id1=getnum(y1,m1,d1),id2=getnum(y2,m2,d2);if(id2-id1<31) continue;Update(1,id1,id2,x);}scanf("%d",&q);for(int i=1;i<=q;i++){int y,m,d;scanf("%d%d%d",&y,&m,&d);int id=getnum(y,m,d);cnt=0;Count(1,id);sort(ans+1,ans+cnt+1);printf("%d",cnt);for(int i=1;i<=cnt;i++) printf(" %d",ans[i]);printf("\n");}}

如果觉得《51nod-1631-小鲨鱼在51nod小学》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。