思路: 首先我們可以理清一下各種情況:
1)m可能為0
2)一次操作時,只需要考慮每節火車的車頭。
3)當一節火車的速度降低時,只會影響它及它后面的車廂
當m=0時,我們可以記錄上一節車頭的速度從而O(n)?解決問題
同理,一節車廂會不會成為車頭取決于上一節車頭的速度,也就是前面車廂的狀態不會改變。 當車廂 k 操作時,首先向后遍歷車頭 x;
- 如果 ax≥ak-d,那么x 將不再是車頭。
然后比較新車廂和這節車廂前的第一個車頭y
- 若ay≥ak-d,那么ak就是新的車頭
我們可以發現能用set做,時間復雜度為O(nlogn)?
代碼:
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int t,a[N]; int main(){scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);set<int> s;for(int i = 1;i <= n;i ++){scanf("%d",&a[i]);if(!s.size()||a[i]<a[*(--s.end())]){s.insert(i);}} while(m--){int k,d;scanf("%d%d",&k,&d);int x=a[k]-d;while(s.lower_bound(k)!=s.end()&&a[*s.lower_bound(k)]>=x) {s.erase(*s.lower_bound(k));}if(s.lower_bound(k)==s.begin()||a[*(--s.lower_bound(k))]>x){s.insert(k);}a[k]-=d;printf("%d ",s.size());}printf("\n");} }