题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428
基准时间限制:1 秒 空间限制:131072 KB 分值: 10
难度:2级算法题
Input
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
3 1 2 3 4 2 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;
}