P1204 [USACO1.2]挤牛奶Milking Cows 差分思想的应用
P1204 [USACO1.2]挤牛奶Milking Cows
从暴力思想出发,建立一个int数组b用来标记哪些时间有人挤牛奶,哪些时间空闲,然后从有挤牛奶的时间开始统计每一个段挤牛奶时间和空闲时间,并求最长挤牛奶时间和最长空闲时间,这样做时间复杂度为O(n*s),s为挤牛奶的时间长度,会TLE。如果优化呢?对于挤牛奶时间[l,r]可以看成对于b[l]+=1,b[r]-=1,时间复杂度为O(n);然后求一次前缀和即可以求出有挤牛奶的时间O(s),最后很容易统计出最长挤牛奶时间和最长空闲时间。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int b[maxn];
int main()
{
int lmin=1e6,rmax=0;
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
lmin=min(lmin,x);rmax=max(rmax,y);
b[x]+=1;b[y]-=1;
}
for (int i=lmin;i<=rmax;i++) b[i]+=b[i-1];
int ans1=0,ans2=0,c1=0,c2=0;
for (int i=lmin;i<=rmax;i++)
{
if (b[i]==0)
{
ans1=max(ans1,c2);
c1++;
c2=0;
}
else
{
ans2=max(ans2,c1);
c2++;
c1=0;
}
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
浙公网安备 33010602011771号