nod-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。意为在<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

思路:

开始还考虑一下二分,发现直接暴力就ok了,这里排了下序,稍微优化了一下;
主要是判断自然月有点绕,如果年份不同肯定可以,如果年份相同,月份差一,那么天只要前小于等于后者就行;否则月份差2以上也是自然月;

代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;

typedef struct DATE
{
    int s;
    int e;
    int w;
    bool is_invalid;
    DATE(int y0,int m0, int d0, int y1, int m1, int d1,int r)
    {
        is_invalid = true;
        if (y0 < y1 || (y0 == y1 && (m1-m0)>1) ||(y0 == y1 && (m1-m0)==1 && d0 <= d1) )
        {
            is_invalid = false;
        }
        s = y0*10000+m0*100+d0;
        e = y1*10000+m1*100+d1;
        w = r;
    }
}Date;
vector<Date>dates;
bool cmp(const Date &a, const Date &b)
{
    return a.s < b.s;
}
//int b_search(int v, int n)
//{
//    int low = 0;
//    int high = n - 1;
//    while(low <= high)
//    {
//        int mid = low + (high-low)/2;
//        if (dates[mid].s >)
//    }
//}
//Date d[100005];
int main()
{
    int n,q;
    scanf("%d", &n);
    int y0,m0,d0,y1,m1,d1,r;
    dates.reserve(n+1);
    for (int i = 0; i < n; ++ i)
    {
        scanf("%d %d %d %d %d %d %d", &y0,&m0,&d0,&y1,&m1,&d1,&r);
        Date date(y0,m0,d0,y1,m1,d1,r);
        if (!date.is_invalid)
        {
            dates.push_back(date);
        }
    }
    sort(dates.begin(),dates.end(),cmp);
    scanf("%d", &q);
    int y,m,d;
    for (int i= 0; i < q; ++ i)
    {
       // int pos = 0;
        scanf("%d %d %d", &y,&m,&d);
        //pos = b_search(y*10000+m*100+d, dates.size());
        int v = y*10000+m*100+d;
        vector<int>res;
        res.reserve(n);
        for (int j = 0; j < dates.size(); ++ j)
        {
            if (v < dates[j].s)
            {
                break;
            }
            if (v >= dates[j].s && v <= dates[j].e)
            {
                res.push_back(dates[j].w);
            }
        }
        sort(res.begin(),res.end());
        if (res.size() == 0)
        {
            printf("0\n");
        }
        else
        {
            printf ("%d", res.size());
            for (int j = 0; j < res.size(); ++ j)
            {
                printf(" %d", res[j]);
            }
            printf("\n");
        }
    }
    return 0;
}


功能简介 “易行辅助”试用版是把“易行象棋连线器试用版”每次5分钟自动连接,以方便试用,还增加了 时间查看等小功能。 “易行辅助”正式版是把“易行象棋连线器试用版”的限时和限次“取消”,增加了计时等小功能。 此辅助每5分钟会自动(亦可手动,右键点此程序的托盘图标选择)初始化一次,此时请勿操作。 注意:试用版只能用75分钟,正式版要注册才能使用!!!! 易行简介 易行象棋连线器是一款棋软及象棋游戏的辅助工具软件,其采用独特的棋盘识别方法,能连过去许多连线不能连的网站,如:JJ中国象棋、越南象棋网、大师网、面对面、同城游戏、中游、联众等。该连线支持多种棋软连线自动下棋,如:天机、旋风、兵河 五四、奇兵、大圣等象棋软件。该软件能随时对任意局面进行连接,能人机操作。可以遮挡棋软和客户端界面。 目前已通过测试的象棋游戏:JJ中国象棋、QQ新中国象棋、QQ旧中国象棋(角色版)、大师网、奕天棋缘、金游世界、同城游、面对面、泓弈象棋网、中游、联众。 使用说明 1、试用版限制使用15次,每次时间5分钟,本辅助会把15次自动连接,可连续使用(共75分钟)1次。 试用版界面上方显示的是每次使用的时间,鼠标右键点本“辅助”托盘图标可以查看剩余时间。 2、正式版界面上方显示的是“辅助”程序运行时间,无使用次数限制,亦无时长限制。正式版要注 册才能使用,联系QQ:48377000。 3、退出本“辅助”,请使用鼠标右键点击本“辅助”右下图标的“退出” 注意事项 1、为了快速上手,如果你使用兵河界面,请使用“系统默认兵河方案界面图”中相同的界面, 系统默认兵河方案是兵河初始的棋盘和底图,小棋子,这样可以不需要做方案直接的连线。 2、“JJ金色赛场自动打擂.exe”注册后才能使用,建议在正常走棋后再打开此工具,不能关闭 “赛场展示:金色娱乐场”窗口。鼠标右键点此程序的托盘图标,有相关功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值