题意: 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 ", x) #define pri(x) printf("%lld ", x) #define lowbit(x) x&-x const ll MOD = 1e18 +7; const ll N = 6e6 +5; ll a[N], s[N]; int main() { ll i, j, k, l=1; ll n, m=0, t; cin>>n; for(i=0; i<n; i++) { cin>>k>>t; a[k]++; a[t]--; m=max(m,t+1); } k=0; s[0]=a[0]; for(i=1; i<=m; i++) { s[i]=s[i-1]+a[i]; k=max(k,s[i]); cout<<s[i]<<' '; } cout<<endl; cout<<k<<endl; return 0; }