题意: n项工作 1~n  工时s[i] ~e[i], 工时有覆盖的工作不能被同一台机器同时操作, 问完成所有工作的最少机器数

思路:前缀差分和

e.g.

a            2 3 4              machine 2

b         1 2 3                 machine1

c                     5 6 7     machine2    a做完后空闲做c

d               3 4 5 6 7     machine1    b做完后空闲做d

最少两台机器

计算时间段重叠,时间点不计

则标记 a[ s[i] ]++, a[ e[i] ]--  (若计时间点则 a[ e[i]+1 ]--

计算前缀和  最大值即为最少机器数

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> p;
typedef long double ld;
#define mem(x) memset(x, 0, sizeof(x))
#define me(x) memset(x, -1, sizeof(x))
#define fo(i,n) for(i=0; i<n; i++)
#define sc(x) scanf("%lf", &x)
#define pr(x) printf("%lld\n", x)
#define pri(x) printf("%lld ", x)
#define lowbit(x) x&-x
const ll MOD = 1e18 +;
const ll N = 6e6 +;
ll a[N], s[N];
int main()
{
ll i, j, k, l=;
ll n, m=, t;
cin>>n;
for(i=; i<n; i++)
{
cin>>k>>t;
a[k]++;
a[t]--;
m=max(m,t+);
}
k=;
s[]=a[];
for(i=; i<=m; i++)
{ s[i]=s[i-]+a[i];
k=max(k,s[i]);
cout<<s[i]<<' ';
}
cout<<endl;
cout<<k<<endl;
return ;
}
04-23 01:26