题意:n个独立车厢速度为 ai,火车向左行驶,车厢速度不能大于前面车厢速度,车速相同的车厢形成列车。m次询问,每次询问输入k,d,使 ak -= d,并求列车个数。
思路:用 set 记录每个列车头的索引,当一个车厢速度减小时,如果它的车速小于前面列车的车速,那么就会形成一个新的列车,就把它的索引加到集合中,而集合中在它的后面的列车速度大于它时就会和它合并,所以就要从集合中删去集合中所有在它后面并且速度大于它的列车。集合的大小就是列车的个数。
代码:
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5 + 10, P = 1e9 + 7, mod = 998244353;
int a[N];
void solve(){
int n, m;
cin >> n >> m;
set<int>s;
for(int i = 1; i <= n; i++) {
cin >> a[i];
if(s.empty() || a[i] < a[*s.rbegin()])
s.insert(i);
}
while(m--){
int k, d; cin >> k >> d;
a[k] -= d;
auto it = s.upper_bound(k);
if(it != s.begin() && a[*--it] > a[k])
s.insert(k);
while(1) {
it = s.upper_bound(k);
if(it != s.end() && a[*it] >= a[k])
s.erase(it);
else break;
}
cout << s.size() << " ";
}
cout << endl;
}
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while(t--) {
solve();
}
return 0;
}