51nod 1631 小鲨鱼在51nod小学

基准时间限制: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

大暴力题

妈的终于A了。。

我屮艸芔茻。。

屠龙宝刀点击就送

#include <algorithm>
#include <cstdio>
#include <cctype>
#define N 100005
using namespace std;
inline void Read(int &x)
{
    register char ch=getchar();
    for(x=0;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
}
struct node
{
    int y0,m0,d0,y1,m1,d1,x;
    bool operator<(node a)const
    {
        return x<a.x;
    }
}Joob[N];
struct nodee
{
    int y,m,d;
}Query[N];
int Que[N],h=0,cnt=0,n,m;
int main(int argc,char *argv[])
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        Read(Joob[++cnt].y0);
        Read(Joob[cnt].m0);
        Read(Joob[cnt].d0);
        Read(Joob[cnt].y1);
        Read(Joob[cnt].m1);
        Read(Joob[cnt].d1);
        Read(Joob[cnt].x);
        if(Joob[cnt].y0>Joob[cnt].y1) cnt--;
        else if(Joob[cnt].m0+1==Joob[cnt].m1&&Joob[cnt].d0>Joob[cnt].d1&&Joob[cnt].y0==Joob[cnt].y1) cnt--;
        else if(Joob[cnt].m0==Joob[cnt].m1&&Joob[cnt].y0==Joob[cnt].y1) cnt--;
        else if(Joob[cnt].y0+1==Joob[cnt].y1&&Joob[cnt].m0==12&&Joob[cnt].m1==1&&Joob[cnt].d0>Joob[cnt].d1) cnt--;
    }
    sort(Joob+1,Joob+1+cnt);
    scanf("%d",&m);
    for(int i=1;i<=m;++i) Read(Query[i].y),Read(Query[i].m),Read(Query[i].d);
    for(int i=1;i<=m;++i)
    {
        for(int j=1;j<=cnt;++j)
        {
            if(Joob[j].y0==Query[i].y&&Joob[j].m0==Query[i].m&&Joob[j].d0==Query[i].d) Que[++h]=Joob[j].x;
            else if(Joob[j].y1==Query[i].y&&Joob[j].m1==Query[i].m&&Joob[j].d1==Query[i].d) Que[++h]=Joob[j].x;
            else if(Joob[j].y0<Query[i].y&&Query[i].y<Joob[j].y1) Que[++h]=Joob[j].x;
            else
            {
                bool flag=0;
                if(Joob[j].y0==Query[i].y)
                {
                    if(Joob[j].m0<Query[i].m&&Query[i].m<Joob[j].m1) Que[++h]=Joob[j].x,flag=1;
                    else if(Joob[j].m0==Query[i].m&&Joob[j].d0<=Query[i].d) Que[++h]=Joob[j].x,flag=1;
                    else if(Joob[j].y1>Query[i].y&&((Joob[j].m0<Query[i].m)||(Joob[j].m0==Query[i].m&&Joob[j].d0<=Query[i].d))) Que[++h]=Joob[j].x,flag=1;
                }
                if(Joob[j].y1==Query[i].y&&!flag)
                {
                    if(Joob[j].m0<Query[i].m&&Query[i].m<Joob[j].m1) Que[++h]=Joob[j].x;
                    else if(Joob[j].m1==Query[i].m&&Joob[j].d1>=Query[i].d) Que[++h]=Joob[j].x;
                    else if(Query[i].y>Joob[j].y0&&((Joob[j].m1>Query[i].m)||(Joob[j].m1==Query[i].m&&Joob[j].d1>=Query[i].d))) Que[++h]=Joob[j].x;
                }
            }
        }
        printf("%d",h);
        for(int p=1;p<=h;++p) printf(" %d",Que[p]);
        h=0;
        printf("\n");
    }
    return 0;
}
时间: 2024-08-05 04:05:14

51nod 1631 小鲨鱼在51nod小学的相关文章

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). 现在给定小鲨鱼的职务履历表,你可以高

51nod 1471 小S的兴趣 sqrt

小S喜欢有趣的事.但是,每个人的兴趣都是独特的.小S热衷于自问自答.有一天,小S想出了一个问题. 有一个包含n个正整数的数组a和针对这个数组的几个问题.这些问题有两种类型: 1.      在数组下标l到r的部分上,将一个单元格循环移动到右端.即以下面方式重新分配数组上的元素. a[l], a[l+1], ..., a[r-1], a[r] → a[r], a[l], a[l+1], ..., a[r-1]. 2.      在数组下标l到r的部分上,计算有多少元素的值与k相等. 小S很喜欢这个

51nod 1831 小C的游戏

小C和小L是好朋友,她们在玩一个游戏. 一开始有一个大小为n的石子堆,小C先手. 每次可以对这个石子堆拿走一个或者把这个石子堆分成等量的几份并只取其中一份(不能不变或只剩下一个). 如果取走最后一个人的算败,请问这个游戏小C是否能胜. Input一行表示数据组数Tcases(Tcases<=1,000). 后面Tcases行每行一个n(n<=1,000,000,000).Output有Tcases行对于先手获胜输出“TAK”,先手狗带输出“NIE”.Sample Input 1 5 Sampl

51nod 2485 小b重排字符串

小b有一个字符串S,现在她希望重排列S,使得S中相邻字符不同. 请你判断小b是否可能成功. 样例解释:将"aab"重排为"aba"即可. 收起 输入 输入一个只包含小写字母的字符串S,其长度n满足1≤n≤500 输出 如果可能,输出"Possible": 否则,输出"Impossible". 输入样例 aab 输出样例 Possible 只要同一种字母不超过总数的一半即可,保证能交叉放开.代码: #include <io

51nod 1643 小Q的家庭作业

题意: f(n) = sigma(gcd(i,n))  1 <= i <= n g(n) = sigma(f(d))    d | n n = x1 * x2 * ... * xm 其中 x[i+1] = (a * x[i] + b) % c + 1 1 <= m <= 10^18 1 <= c <= 10^7 1 <= x[1],a,b  <= c 首先,发现f,g函数都是积性函数 并且推下公式:g[n] = n * (k1 + 1 ) * (k2 + 1

51nod 1831 小C的游戏(博弈论+打表)

比较坑的题目. 题意就是:给出一堆石子,一次操作可以变成它的约数个,也可以拿只拿一个,不能变成一个,最后拿的人输. 经过打表发现 几乎所有质数都是先手必败的,几乎所有合数都是先手必胜的 只有几个例外,就是17^n, 2^n这些. 不过继续推导可以发现16是先手必败的,因为2,4,8,15都是先手必胜的 所以2^n(n>4)都是先手必胜的 17是先手必胜的,所以17^2是先手必败的,17^n(n>2)是先手必胜的 17*2是先手必败的 同理可以推导出2^n*17^m这些(当n>1或m>

51nod 1804 小C的多边形(构造)

首先可以算出无解的充分不必要条件,所有边的和为sum=3*((n-1)*n)/2,如果sum%n!=0显然无解. 也就是说n为奇数必然无解.现在考虑n为偶数的情况. 不妨假设n为偶数有解,现在考虑如何将这个解构造出来. 设此时n边形的为2*k+1,那么也就说,内边的每相邻两个边的和要为{k+2....3*k+2} 把边构造成这个样子即可. k+1 1 k+2 2 k+3......2*k+1. 另外这个oj的读入效率真是感人肺腑啊... # include <cstdio> # include

51nod——2476 小b和序列 预处理

对于每一个元素,预处理出它作为最小值,两边可以作用到的最大位置.比如下标∈[0,8]的这个数组:1 8 6 2 5 4 3 8 7,1可以作用到所有区间,2可以作用到区间[1,8],第一个8可以作用到[1,7].也就是说从两边分别找到第一个大于等于这个元素的位置,然后标记,其实就是找最宽的区间长度.可能左边更宽也可能右边更宽,对所有元素的max(a[i]*(i-l[i])),a[i]*(r[i]-i)) 求max就是答案了. 1 #include <bits/stdc++.h> 2 using

51nod 1277 KMP 前缀出现次数

51NOD 1277:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277 跟HDU 6153还挺像的:http://www.cnblogs.com/Egoist-/p/7435573.html 相比与上面那个题,这个还要相对简单一些,只需要处理模式串自己就好了. 一开始写麻烦了,直接套了HDU6153的代码,后来发现--他就是个模式串本身的匹配,我干嘛弄那么麻烦Orz 题意:找前缀长度*出现次数的最大值,长度好说,