CF 1690 G. Count the Trains 思维 2000

12 篇文章 0 订阅

题意: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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值