タイトルリンク:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1517
トピック
長さnの配列の場合、毎回番号aiを選択すると、aiは現在の位置から位置を入れ替えます。右側の数値が彼よりも小さい場合は、位置を入れ替えます。それ以外の場合は、移動を停止します。
最終的なシーケンスを昇順にするために、少なくともいくつかのポイントを移動するように依頼します。
アイデア
最初の判断基準は、後ろに彼よりも小さい数字があるかどうかであり、各数字は後ろにしか移動できないかどうかです。その後、彼よりも小さい数字は左に走らず、変化しません。
次に、選択した数値に共通する点が1つあります。つまり、後で小さい数値があるかどうかにかかわらず、xの最小値をnに前処理してから、現在の値をそれと比較できます。
ACコード
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 5;
int a[maxn], b[maxn];
int main(){
int t; cin >> t;
while(t --){
int n; cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
b[n + 1] = 0x3f3f3f3f;
for(int i = n; i >= 1; i --) b[i] = min(b[i + 1], a[i]);
int ans = 0;
for(int i = 1; i <= n; i ++){
if(a[i] > b[i]) ans ++;
}
cout << ans << endl;
}
return 0;
}