E. Memory and Casinos

题目连接:

http://codeforces.com/contest/712/problem/E

Description

There are n casinos lined in a row. If Memory plays at casino i, he has probability pi to win and move to the casino on the right (i + 1) or exit the row (if i = n), and a probability 1 - pi to lose and move to the casino on the left (i - 1) or also exit the row (if i = 1).

We say that Memory dominates on the interval i... j if he completes a walk such that,

He starts on casino i.
He never looses in casino i.
He finishes his walk by winning in casino j.

Note that Memory can still walk left of the 1-st casino and right of the casino n and that always finishes the process.

Now Memory has some requests, in one of the following forms:

1 i a b: Set .
2 l r: Print the probability that Memory will dominate on the interval l... r, i.e. compute the probability that Memory will first leave the segment l... r after winning at casino r, if she starts in casino l.

It is guaranteed that at any moment of time p is a non-decreasing sequence, i.e. pi ≤ pi + 1 for all i from 1 to n - 1.

Please help Memory by answering all his requests!

Input

The first line of the input contains two integers n and q(1 ≤ n, q ≤ 100 000), — number of casinos and number of requests respectively.

The next n lines each contain integers ai and bi (1 ≤ ai < bi ≤ 109) — is the probability pi of winning in casino i.

The next q lines each contain queries of one of the types specified above (1 ≤ a < b ≤ 109, 1 ≤ i ≤ n, 1 ≤ l ≤ r ≤ n).

It's guaranteed that there will be at least one query of type 2, i.e. the output will be non-empty. Additionally, it is guaranteed that p forms a non-decreasing sequence at all times.

Output

Print a real number for every request of type 2 — the probability that boy will "dominate" on that interval. Your answer will be considered correct if its absolute error does not exceed 10 - 4.

Namely: let's assume that one of your answers is a, and the corresponding answer of the jury is b. The checker program will consider your answer correct if |a - b| ≤ 10 - 4.

Sample Input

3 13

1 3

1 2

2 3

2 1 1

2 1 2

2 1 3

2 2 2

2 2 3

2 3 3

1 2 2 3

2 1 1

2 1 2

2 1 3

2 2 2

2 2 3

2 3 3

Sample Output

0.3333333333

0.2000000000

0.1666666667

0.5000000000

0.4000000000

0.6666666667

0.3333333333

0.2500000000

0.2222222222

0.6666666667

0.5714285714

0.6666666667

Hint

题意

在第i个位置,你有pi的概率走到i+1,有(1-pi)的概率走到i-1

单点修改概率

区间查询从L开始,从R离开的概率是多少

题解:

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
typedef pair<double,double> SgTreeDataType;
struct treenode
{
int L , R ;
SgTreeDataType A;
void updata(SgTreeDataType v)
{
A=v;
}
};
pair<double,double>tmp=make_pair(1.0,0);
treenode tree[maxn*4]; inline void push_up(int o)
{
tree[o].A.first = tree[o*2].A.first*tree[o*2+1].A.first;
tree[o].A.second = tree[o*2].A.second + tree[o*2+1].A.second * tree[o*2].A.first;
} inline void build_tree(int L , int R , int o)
{
tree[o].L = L , tree[o].R = R;
if (R > L)
{
int mid = (L+R) >> 1;
build_tree(L,mid,o*2);
build_tree(mid+1,R,o*2+1);
}
} inline void update(int QL,int QR,SgTreeDataType v,int o)
{
int L = tree[o].L , R = tree[o].R;
if (QL <= L && R <= QR) tree[o].updata(v);
else
{
int mid = (L+R)>>1;
if (QL <= mid) update(QL,QR,v,o*2);
if (QR > mid) update(QL,QR,v,o*2+1);
push_up(o);
}
} inline SgTreeDataType query(int QL,int QR,int o)
{
int L = tree[o].L , R = tree[o].R;
if (QL <= L && R <= QR) return tree[o].A;
else
{
int mid = (L+R)>>1;
SgTreeDataType AA=tmp,BB=tmp,CC;
if (QL <= mid) AA = query(QL,QR,2*o);
if (QR > mid) BB = query(QL,QR,2*o+1);
push_up(o);
CC.first=AA.first*BB.first;
CC.second=AA.second+BB.second*AA.first;
return CC;
}
} int main()
{
int n,q;
scanf("%d%d",&n,&q);
build_tree(1,n,1);
for(int i=1;i<=n;i++)
{
double a,b;
cin>>a>>b;
double p = a/b;
update(i,i,make_pair((1.0-p)/p,(1.0-p)/p),1);
}
for(int i=1;i<=q;i++)
{
int op,a,b,c;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&a,&b,&c);
double p = 1.0*b/(1.0*c);
pair<double,double>D=make_pair((1-p)/p,(1-p)/p);
update(a,a,D,1);
}
else
{
scanf("%d%d",&a,&b);
double p = query(a,b,1).second;
if(p<1e20)printf("%.12f\n",1.0/(1.0+p));
else printf("0.000000000000\n");
}
}
return 0;
}

Codeforces Round #370 (Div. 2) E. Memory and Casinos 线段树的更多相关文章

  1. Codeforces Round #370 (Div. 2) E. Memory and Casinos (数学&&概率&&线段树)

    题目链接: http://codeforces.com/contest/712/problem/E 题目大意: 一条直线上有n格,在第i格有pi的可能性向右走一格,1-pi的可能性向左走一格,有2中操 ...

  2. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树

    题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...

  3. Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash

    E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...

  4. Codeforces Round #223 (Div. 2) E. Sereja and Brackets 线段树区间合并

    题目链接:http://codeforces.com/contest/381/problem/E  E. Sereja and Brackets time limit per test 1 secon ...

  5. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序

    题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...

  6. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  7. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  8. Codeforces Round #227 (Div. 2) E. George and Cards 线段树+set

    题目链接: 题目 E. George and Cards time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 ...

  9. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

随机推荐

  1. asp.net MVC实现文章的上一篇下一篇

    由于这个东西的原理没有什么难的(只是实现的时候有少量的坑),故直接上代码以便查阅.另:本文给出的Action附送了点击量统计. public ActionResult SingleNews(int? ...

  2. Xamarin

    快速建立原生(Native)的行动装置应用程序: 程序代码共享: 与 Visual Studio 整合: 确保第一时间更新: 原生的应用程序效能:

  3. Android MimeType的用法和几种类型

    关于MIME TYPE描述 多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII ...

  4. RF--换行

    引自:http://blog.csdn.net/lvtingting2007/article/details/42173991

  5. python脚本利用windows计划定时执行

  6. JAVA枚举

    枚举类型的使用: 定义一个枚举变量: enum Day{ MOD,TUE,WED,THR,FRI; }; 可以直接输出枚举变量的字符串形式和利用switch输出,在JDK1.6及之前switch只识别 ...

  7. YOU KNOW NOTHING , SNOW

    JVM运行时数据区域 方法区: 用 于存储虚拟机加载的类信息,常量,静态变量,JIT编译后的代码,所有线程共享 堆:所有线程共享,用来存储实例对象. 虚拟机栈:线程私有,生命周期与线程相同,每个方法被 ...

  8. [问题2014A11] 解答

    [问题2014A11]  解答 我们需要利用以下关于幂等阵判定的结论,它是复旦高代书第 142 页的例 3.6.4: 结论  设 \(A\) 为 \(n\) 阶方阵, 则 \(A^2=A\) 当且仅当 ...

  9. Java动态代理的两种实现方式:

    方式一:传统的代理 package cn.hc.domain; import java.lang.reflect.InvocationHandler; import java.lang.reflect ...

  10. How To Use FETCH_RECORDS In Oracle Forms

    When called from an On-Fetch trigger, initiates the default Form Builder processing for fetching rec ...