C. Min Max Sort
很不錯的一道題目,不過腦電波和出題人每對上, q w q 。 qwq。 qwq。
正難則反。
我們考慮最后一步是怎么操作的。
最后一步一定是對 1 1 1和 n n n進行操作
那么上一步呢?
上一步應該是對 2 2 2和 n ? 1 n-1 n?1
以此類推
第一步應該是對 n 2 \frac{n}{2} 2n?和 n 2 + 1 \frac{n}{2}+1 2n?+1
我們的答案應該是上一步之前的所有操作次數加上最后一步的操作次數。
然后對于 i ∈ [ 1 , n 2 ] i \in [1, \frac{n}{2}] i∈[1,2n?]并不是所有 i i i都需要進行操作的。
如果本身 i i i到 n ? i + 1 n-i+1 n?i+1已經是有序的就不需要進行操作了。
如何判斷是不是有序的呢?
這里預處理出來一個 f i f_i fi?表示,以 i i i結尾的最長連續上升序列的長度。
如果 f [ n ? i + 1 ] < n ? i + 1 ? i + 1 f[n-i+1]<n-i+1-i+1 f[n?i+1]<n?i+1?i+1說明這個 i i i到 n ? i + 1 n-i+1 n?i+1不是有序的則需要進行一次操作
#include <bits/stdc++.h>#define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); ++i)
#define fep(i, a, b) for(int i = (a); i >= (b); --i)
#define _for(i, a, b) for(int i=(a); i<(b); ++i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>using namespace std;
const int maxn = 2e5 + 10;
int n,a[maxn],f[maxn];void solve() {cin>>n;int lst=0;rep(i,1,n){f[i]=0;cin>>a[i];}rep(i,1,n) {f[a[i]]=f[a[i]-1]+1;}int ans=0;fep(i,n/2,1){if(f[n-i+1]<n-i+1-i+1){ans++;}}cout<<ans<<endl;
}signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
// freopen("C:\\Users\\24283\\CLionProjects\\untitled2\\1.in", "r", stdin);int _;cin >> _;while (_--)solve();return 0;
}