标签:ch int 题解 Random while st ge include CF1461C
首先,从后往前扫,找出第一个\(a_i\neq i\)的位置,记为\(st\)
从前往后扫,对于\(r_i<st\)的,选不选都没关系。
对于\(r_i\ge st\)的,至少有一个成功排序就会使整个序列被排序
考虑容斥,用所有情况减去\(r_i\ge st\)一个都不选的情况即可
即\(ans = 1-\prod\limits_{r_i\ge st} {1-p_i}\)
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int t,n,m;
int a[100005],st;
inline int read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int r[100005];
double p[100005];
int main () {
t = read();
while(t--) {
n = read();m = read();
int flag = 1;
for(int i = 1;i <= n;i++) a[i] = read();
for(int i = 1;i <= m;i++) {
scanf("%d%lf",&r[i],&p[i]);
}
for(int i = 1;i <= n;i++) flag = flag & (a[i] == i);
if(flag) {
puts("1.00000000");
continue;
}
for(int i = n;i >= 1;i--) {
if(a[i] != i) {
st = i;
break;
}
}
double ans = 1;
for(int i = 1;i <= m;i++) {
if(r[i] < st) continue;
if(ans == 0) ans = 1-p[i];
else ans = ans * (1-p[i]);
}
printf("%.10lf\n",1-ans);
}
return 0;
}
标签:ch,int,题解,Random,while,st,ge,include,CF1461C 来源: https://www.cnblogs.com/ctt2006/p/14132078.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。