牛客-小Why的商品归位(差分、区间和)

发布时间 2023-09-20 17:39:19作者: 哎呦哎(iui)

链接:https://ac.nowcoder.com/acm/contest/64384/C
来源:牛客网

超市里一共有 \(n\) 个货架,\(m\) 个商品,一开始商品的位置是被打乱的,小Why需要将商品全部归位。
小Why在给货架编号后,实现了每个商品所在货架必然在其应在货架之前。
小Why决定手推购物车按编号顺序依次访问每个货架。在访问货架时,小Why可以执行以下两个操作任意多次:
\(\bullet\) 当购物车不为空时,将购物车中的一个商品放上货架。
\(\bullet\) 当货架不为空时,将货架上的一个商品放入购物车。
当小Why跑完一趟后,如果仍有商品没被归位,那么小Why会再次返回 1 号货架重复以上过程。
超市里的购物车同一时刻最多能放 \(k\) 个商品,且每个货架容量无限,请你告诉小Why至少需要跑多少趟才能将商品全部归位。

输入描述:
第一行包括三个整数 \(n,m,k \ (2 \leq n \leq 10^6 , 1\leq m,k\leq10^6)\),表示货架个数,商品个数和购物车容量。
接下来 \(m\) 行,每行有两个整数 \(st_{i},ed_{i} ( 1 \leq st_{i} < ed_{i} \leq n)\),表示第 ii 个商品的所在货架和应在货架。
输出描述:
输出一个整数,表示最少需要的趟数。
示例1
输入
复制
3 3 1
1 2
1 3
2 3
输出
复制
2

我们先讲讲这个样例,首先它的购物车的容量为1,然后第一个商品本应该放在第二个货架上,然后他放在了第一个货架上,然后第二个商品本应该放在第三个货架上他放在了第一个货架上,然后第三个商品本应该放在第3个货架上他放在了第二个货架上,
他最少需要两趟,第一趟再第一个货架上拿上1号商品,然后走到第二个货架上将第一个商品放上,然后拿上第三个商品,走到第三个货架上放上。
然后第二趟在哪第二个商品。

其实这是一个区间覆盖的问题,用的是区间和,我们将这些货架看成一下点,然后点之间相隔看成距离,对于放在1号货架本应该放在2号货架的商品,我们将[1,2]区间++,说明我们得走这一趟,然后我们将所有点进去区间求和之后,我们取区间中的最大值,然后除上购物车的容量就行。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int main() 
{
int n,m,k;

cin>>n>>m>>k;
for(int i=1;i<=m;i++)
{
	int s,e;
	cin>>s>>e;
	 a[s]++;
	 a[e]--;
}
int ans=0;
for(int i=1;i<=n;i++)
{
	a[i]+=a[i-1];
	ans=max(ans,a[i]);
}
cout<<(ans-1)/k+1<<endl;
}