学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
给定一个长度为n的序列
a
1
,
a
2
,
…
,
a
n
a_1,a_2,\dots,a_n
a1,a2,…,an。请你找出一共有多少个数对(i,j)满足
a
i
<
i
<
a
[
j
]
<
j
,
1
≤
i
,
j
≤
n
a_i<i<a[j]<j,1\le i,j\le n
ai<i<a[j]<j,1≤i,j≤n。
例如,长度为8的序列[1,1,2,3,8,2,1,4],有3个满足要求的数对:(2,4)、(2,8)、(3,8);
1)数对(2,4)有a[2]=1,a[4]=3满足a[2]<2<a[4]<4;
2)数对(2,8)有a[2]=1,a[8]=4满足a[2]<2<a[8]<8;
3)数对(3,8)有a[3]=2,a[8]=4满足a[3]<3<a[8]<8。
【输入样例】
8
1 1 2 3 8 2 1 4
【输出样例】
3
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, a[2000005], s[2000005];
long long ans;
int main()
{
cin >> n;
for (int i=1; i<=n; i++) {
scanf("%d", &a[i]);
if (a[i]<i) s[i] = s[i-1]+1; // 预处理i及之前满足a[i]<i的个数
else s[i] = s[i-1];
}
for (int j=1; j<=n; j++) { // 遍历n个数
if (a[j]<j && a[j]-1>=1) { // 满足a[j]<j
ans += s[a[j]-1]; // 并计算a[j]-1(肯定小于a[j])坐标下满足a[a[j]-1]<(a[j]-1)的个数
}
}
cout << ans << endl; // 输出结果
return 0;
}
【运行结果】
8
1 1 2 3 8 2 1 4
3