方法:预处理找出 i > a[i] 的序列并存储,之后逐个二分搜索
注意 最后的 answer 要开long long 不然会WA 在第4个样例
//AC 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 4e5 + 10;
ll a[maxn];
ll b[maxn];
struct node{
ll val;
ll id;
}h[maxn];
bool cmp(struct node x, struct node y){
return x.id < y.id;
}
int main(){
ll t, n;
cin>>t;
while(t--){
cin>>n; ll cnt = 0; ll ans = 0;
for(ll i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
if(i > a[i]){
cnt++;
h[cnt].id = i;
h[cnt].val = a[i];
b[cnt] = a[i];
}
}
sort(h + 1, h + 1 + cnt, cmp);
sort(b + 1, b + 1 + cnt);
for(ll i = 1; i <= cnt; i++){
ll pos = upper_bound(b + 1, b + 1 + cnt, h[i].id) - b;
if(pos != cnt + 1){
ll len = cnt - pos + 1;
ans = ans + len;
}else break;
}
cout<<ans<<endl;
}
return 0;
}