专栏文章

题解:CF1461C Random Events

CF1461C题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mipji5dh
此快照首次捕获于
2025/12/03 13:01
3 个月前
此快照最后确认于
2025/12/03 13:01
3 个月前
查看原文
题目告诉我们有一个序列 aa,那么这个 aa 就可以分为两个部分。
第一个部分:11 ~ kk,这个区间内至少有一个元素排列后位置不一样。
第二个部分:k+1k + 1 ~ nn,这个区间内所有的数字有序排列后对应的数字位置不变。
明显,只用当 krink \le r_i \le n 的情况下进行排列才可以让 aa 变得有序。
对于答案,考虑求出所有操作排列都不有序的概率 ansans,那么答案就是 1ans1 - ans
特别的:对于序列本来就有序的情况,那么答案就是 11
code:
CPP
#include <bits/stdc++.h>
using namespace std;

int n, m, k;
int a[100009];
long double ans;

inline void sovel() {
	cin >> n >> m;
	ans = 1;
	k = n + 1;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	while(a[k - 1] == k - 1 && k - 1 >= 1) k--;
	k--;
	while(m--) {
		int r;
		long double p;
		cin >> r >> p;
		if(r >= k) {
			ans *= (1 - p);
		}
	}
	if(k == 0)
		cout << 1 << "\n"; 
	else 
		cout << 1 - ans << "\n";
}

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int _T = 1;
	cin >> _T;
	while(_T--) {
		sovel();
	}

	return 0;

}

评论

1 条评论,欢迎与作者交流。

正在加载评论...