51 NOD 1428 活动安排问题(树状数组+离散化)

来源:互联网 发布:手机系统更换软件 编辑:程序博客网 时间:2024/05/16 01:48

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428

1428 活动安排问题
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
 收藏
 关注
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 
Input
第一行一个正整数n (n <= 10000)代表活动的个数。第二行到第(n + 1)行包含n个开始时间和结束时间。开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
31 23 42 9
Output示例
2

解析:由于数据比较大,10^9,咱可以先离散化下,最多10000*2个数,给他们排下序,标下号1~n,然后就是树状数组求区间重复个数了,如果[l,r],那么l位置+1,r+1位置-1就好了。

代码:

#include<bits/stdc++.h>using namespace std;int s[100009], e[100009], d[200009];int dp[200009], len;void add(int k, int v){    while(k <= len+10)    {        dp[k] += v;        k += k&(-k);    }}int sum(int k){    int ans = 0;    while(k)    {        ans += dp[k];        k -= k&(-k);    }    return ans;}int main(){    int n;    scanf("%d", &n);    memset(dp, 0, sizeof(dp));    len = 0;    for(int i = 1; i <= n; i++)    {        scanf("%d%d", &s[i], &e[i]);        d[len++] = s[i]; d[len++] = e[i];    }    sort(d, d+len);    len = unique(d, d+len) - d;    for(int i = 1; i <= n; i++)    {        s[i] = lower_bound(d, d+len, s[i]) - d;        e[i] = lower_bound(d, d+len, e[i]) - d;        add(s[i]+1, 1);        add(e[i]+1, -1);    }    int ans = 0;    for(int i = 1; i <= len+1; i++)        ans = max(ans, sum(i));    printf("%d\n", ans);    return 0;}



原创粉丝点击