题解分享
题解分享简介
商品库存管理(编程题) - 题解
```
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5+10;
pair<int,int> g[N];
int a[N]; // 差分数组
int main()
{
// 初始商品库存均为0,执行完全部操作后分为2种情况:
// 商品库存<=1 : 表示被0或1个区间包含
// 商品库存>1 : 表示被1个以上的区间包含
// 因为每次只能撤回一次操作,等价于求[l,r]<=1的个数,
// 还原差分数组时计算一下区间1的个数的前缀和就解决了
int n,m; // 商品的种类数和操作的个数
cin >> n >> m;
int l, r;
for(int i = 1; i <= m; i++)
{
cin >> l >> r;
g[i] = {l,r};
a[l] += 1;
a[r+1] -= 1;
}
// 计算出执行所有操作后的序列
for(int i = 1; i <= n; i++)
{
a[i] += a[i-1];
}
// 将库存量转换为 0 或 1:大于 1 的库存归为 0,小于等于 1 归为 1
for(int i = 1; i <= n; i++)
{
if(a[i] > 1)
{
a[i] = 0; // 说明该商品库存过多,不算在库存为0的商品种类数中
}
else
{
a[i] = 1; // 库存为 1或0,表示该商品被选中
}
}
// 求值为1的个数的前缀和
for(int i = 1; i <= n; i++)
{
a[i] += a[i-1];
}
for(int i = 1; i <= m; i++)
{
int l = g[i].first, r = g[i].second;
// 求[l,r]这个区间里面值为1的元素的个数
cout << a[r] - a[l-1] << endl;
}
return 0;
}
```
查看全文
0
0
1
1



