sasigiii 题解分享 · 2025/2/13
商品库存管理(编程题) - 题解
``` #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