Yet Another Problem About Pairs Satisfying an Inequality
思路
数据量1e5 所以我们要用O(nlog(n))或者更小时间复杂度的算法,nlog(n)我们很自然就会想到这是二分查找的时间复杂度,我们要求的是ai<i<aj<j对于ai<i和aj<j我们在一开始读入的时候就可以挑选出来合适的pair,然后我们就可以找i<aj的对数成为答案,这里我们就可以用二分了,可以对于每一个pair的i找符合条件的aj,那么我们就可以根据aj的大小排下序,然后进行二分找大于i的最小值所在的位置然后累加即可
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
typedef long long ll;
int t,n;
pair<int,int>arr[N];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
int idx=0;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x<i)
arr[idx++]={x,i};
}
sort(arr,arr+idx);
ll res=0;
for(int i=0;i<idx;i++)
{
int x=arr[i].second;
int l=i,r=idx;
while(l<r)
{
int mid=l+r>>1;
if(arr[mid].first>x)
{
r=mid;
}
else
{
l=mid+1;
}
}
res+=idx-l;
}
printf("%lld\n",res);
}
return 0;
}