解题思路
先记录下最后一个不对的位置,即符合 a [ i ] ≠ i a[i] \ne i a[i]=i 时的 i m a x i_{max} imax ,记为 k k k,我们只需要判断 a [ 1 ] a[1] a[1] 到 a [ k − 1 ] a[k-1] a[k−1] 即可。
对于 i ∈ [ 1 , n ] i \in [1,n] i∈[1,n],如果 r [ i ] < k r[i] < k r[i]<k,这个操作就没有用了。
否则,只要有一个就可以成功。
则答案为 1 − Π i = 1 n ( r [ i ] ≥ k ) × ( 1 − p [ i ] ) 1-\Pi_{i=1}^n(r[i] \ge k) \times (1-p[i]) 1−Πi=1n(r[i]≥k)×(1−p[i])。
特别需要注意的是,初始就合法的情况需要特判、
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int a[N], r[N];
double p[N];
int main() {
ios :: sync_with_stdio(0);
int _;
cin >> _;
while (_--) {
int n, m, k = -1;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
for (int i = 1; i <= m; ++i) {
cin >> r[i] >> p[i];
}
for (int i = n; i; --i) {
if (a[i] != i) {
k = i;
break;
}
}
if (k == -1) {
cout << 1 << '\n';
continue;
}
double res = 1;
for (int i = 1; i <= m; ++i) {
if (r[i] < k) {
continue;
}
res = res == 0 ? (1 - p[i]) : res * (1 - p[i]);
}
cout << fixed << setprecision(6) << 1 - res << '\n';
}
return 0;
}
Good Good 贺题,Day Day Up!!