hdoj 4509 湫湫系列故事——减肥记II 【线段树】

湫湫系列故事——减肥记II

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2930    Accepted Submission(s): 1199


Problem Description
  虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!
于是,结果显而易见…
  但是没有什么能难倒高智商美女湫湫的,她决定另寻对策——吃没关系,咱吃进去再运动运动消耗掉不就好了?
  湫湫在内心咆哮:“我真是天才啊~\(≧▽≦)/~”

  可是,大家要知道,过年回家多忙啊——帮忙家里做大扫除,看电影,看小说,高中同学聚餐,初中同学聚餐,小学同学聚餐,吃东西,睡觉,吃东西,睡觉,吃东西,睡觉……所以锻炼得抽着时间来。

  但是,湫湫实在太忙了,所以没时间去算一天有多少时间可以用于锻炼,现在她把每日行程告诉你,拜托你帮忙算算吧~

  皮埃斯:一天是24小时,每小时60分钟
 

Input
输入数据包括多组测试用例。
每组测试数据首先是一个整数n,表示当天有n件事要做。 
接下来n行,第i行是第i件事的开始时间和结束时间,时间格式为HH:MM。

[Technical Specification]
1. 1 <= n <= 500000
2. 00 <= HH <= 23
3. 00 <= MM <= 59
 

Output
请输出一个整数,即湫湫当天可以用于锻炼的时间(单位分钟)
 

Sample Input
 
   
1 15:36 18:40 4 01:35 10:36 04:54 22:36 10:18 18:40 11:47 17:53
 

Sample Output
 
   
1256 179
Hint
大量输入,建议用scanf读数据。
 

裸的线段树


AC代码:


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define INF 1000000
#define eps 1e-8
#define MAXN (2000+10)
#define MAXM (100000+10)
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%.2lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while((a)--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define LL long long
#define lson o<<1, l, mid
#define rson o<<1|1, mid+1, r
#define ll o<<1
#define rr o<<1|1
#define PI acos(-1.0)
#pragma comment(linker, "/STACK:102400000,102400000")
#define fi first
#define se second
using namespace std;
typedef pair pii;
struct Tree{
    int l, r, sum, lazy;
};
Tree tree[MAXN<<2];
void PushUp(int o){
    tree[o].sum = tree[ll].sum + tree[rr].sum;
}
void PushDown(int o)
{
    if(tree[o].lazy != -1)
    {
        tree[ll].lazy = tree[rr].lazy = tree[o].lazy;
        tree[ll].sum = 0;
        tree[rr].sum = 0;
        tree[o].lazy = -1;
    }
}
void Build(int o, int l, int r)
{
    tree[o].l = l; tree[o].r = r;
    tree[o].sum = r - l + 1; tree[o].lazy = -1;
    if(l == r) return ;
    int mid = (l + r) >> 1;
    Build(lson); Build(rson);
}
void Update(int o, int L, int R)
{
    if(tree[o].l == L && tree[o].r == R)
    {
        tree[o].lazy = 0;
        tree[o].sum = 0;
        return ;
    }
    PushDown(o);
    int mid = (tree[o].l + tree[o].r) >> 1;
    if(R <= mid) Update(ll, L, R);
    else if(L > mid) Update(rr, L, R);
    else {Update(ll, L, mid); Update(rr, mid+1, R);}
    PushUp(o);
}
int main()
{
    int n;
    while(Ri(n) != EOF)
    {
        Build(1, 0, 1440-1);
        for(int i = 0; i < n; i++)
        {
            int sh, sm, th, tm;
            scanf("%d:%d%d:%d", &sh, &sm, &th, &tm);
            int s = sh * 60 + sm;
            int t = th * 60 + tm - 1;
            if(s <= t) Update(1, s, t);
        }
        Pi(tree[1].sum);
    }
    return 0;
}


你可能感兴趣的:(线段树)