One day Natalia was walking in the woods when she met a little mushroom gnome. The gnome told her the following story:

Everybody knows that the mushroom gnomes' power lies in the magic mushrooms that grow in the native woods of the gnomes. There are n trees and m magic mushrooms in the woods: the i-th tree grows at a point on a straight line with coordinates ai and has the height of hi, the j-th mushroom grows at the point with coordinates bj and has magical powers zj.

But one day wild mushroommunchers, the sworn enemies of mushroom gnomes unleashed a terrible storm on their home forest. As a result, some of the trees began to fall and crush the magic mushrooms. The supreme oracle of mushroom gnomes calculated in advance the probability for each tree that it will fall to the left, to the right or will stand on. If the tree with the coordinate x and height h falls to the left, then all the mushrooms that belong to the right-open interval [x - h, x), are destroyed. If a tree falls to the right, then the mushrooms that belong to the left-open interval (x, x + h] are destroyed. Only those mushrooms that are not hit by a single tree survive.

Knowing that all the trees fall independently of each other (i.e., all the events are mutually independent, and besides, the trees do not interfere with other trees falling in an arbitrary direction), the supreme oracle was also able to quickly calculate what would be the expectation of the total power of the mushrooms which survived after the storm. His calculations ultimately saved the mushroom gnomes from imminent death.

Natalia, as a good Olympiad programmer, got interested in this story, and she decided to come up with a way to quickly calculate the expectation of the sum of the surviving mushrooms' power.

Input

The first line contains two integers n and m (1 ≤ n ≤ 105, 1 ≤ m ≤ 104) — the number of trees and mushrooms, respectively.

Each of the next n lines contain four integers — ai, hi, li, ri (|ai| ≤ 109, 1 ≤ hi ≤ 109, 0 ≤ li, ri, li + ri ≤ 100) which represent the coordinate of the i-th tree, its height, the percentage of the probabilities that the tree falls to the left and to the right, respectively (the remaining percentage is the probability that the tree will stand on).

Each of next m lines contain two integers bj, zj (|bj| ≤ 109, 1 ≤ zj ≤ 103) which represent the coordinate and the magical power of the j-th mushroom, respectively.

An arbitrary number of trees and mushrooms can grow in one point.

Output

Print a real number — the expectation of the total magical power of the surviving mushrooms. The result is accepted with relative or absolute accuracy 10 - 4.

Examples

Input
1 1
2 2 50 50
1 1
Output
0.5000000000
Input
2 1
2 2 50 50
4 2 50 50
3 1
Output
0.2500000000

题意:现在有N棵树,M棵蘑菇,每棵树给出位置Ai,高度Hi,以及倒左边的概率Li,覆盖区间[Ai-Hi,Ai)倒右边的概率Ri,覆盖区间为(Ai,Ai+Hi],没棵蘑菇有一定的价值,如果蘑菇被一颗或者多棵树覆盖,则其价值为0,现在问最终这么蘑菇价值的期望。

思路:蘑菇之间没有影响,单独考虑其价值的贡献,很显然我们可以用线段树来表示覆盖情况,每次下推对应区间1-P的概率,代表不被其覆盖的概率。

最终每个蘑菇*不被覆盖的概率即可。现在我们用排序来做这个题:

引申:我们已经见过很多次这样的题,有多个线段[Li,Ri],现在问这些线段覆盖了多少个点,我们可以把每个线段拆成两个端点(Li,-1),(Ri+1,1),然后排序blabla。省去了用线段树模拟的过程。  此题一样可以这样搞。

把每个线段拆成左闭右开的区间,然后排序,如果遇到左端点P*=0.01*(100-p),遇到右端点则P/=0.01*(100-p);但是这样一直除或者一直乘,会误差越来越大(比如有多个左端点在0除,会一直除.....),所以我们记录每个p的个数。最后再快速幂累乘。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define F first
#define S second
using namespace std;
const int maxn=;
pii a[maxn],b[maxn]; int tot,cnt[];
double qpow(double a,int x){
double res=1.0; while(x){
if(x&) res=res*a;
a=a*a; x>>=;
}return res;
}
int main()
{
int N,M,i,j,A,H,L,R;
scanf("%d%d",&N,&M);
rep(i,,N){
scanf("%d%d%d%d",&A,&H,&L,&R);
b[++tot]=mp(A-H,L); b[++tot]=mp(A,-L); //左闭右开
b[++tot]=mp(A+,R); b[++tot]=mp(A+H+,-R);
}
rep(i,,M) scanf("%d%d",&a[i].F,&a[i].S);
sort(a+,a+M+); sort(b+,b+tot+);
double ans=; int pos=;
rep(i,,M){
while(pos<=tot&&b[pos].F<=a[i].F){
if(b[pos].S>) cnt[b[pos].S]++;
if(b[pos].S<) cnt[-b[pos].S]--;
pos++;
}
if(!cnt[]){
double p=a[i].S;
rep(j,,) p*=qpow(0.01*(-j),cnt[j]);
ans+=p;
}
}
printf("%.12lf\n",ans);
return ;
}

CodeForces - 138C: Mushroom Gnomes - 2 (线段树&概率&排序)的更多相关文章

  1. Codeforces 138C Mushroom Gnomes - 2 线段树

    Mushroom Gnomes - 2 感觉没啥东西, 用线段树算算每个被覆盖的概率, 坑点是有很多个在同一个点. #include<bits/stdc++.h> #define LL l ...

  2. Codeforces 588E. A Simple Task (线段树+计数排序思想)

    题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...

  3. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  4. codeforces 22E XOR on Segment 线段树

    题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...

  5. Codeforces Gym 100803G Flipping Parentheses 线段树+二分

    Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...

  6. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  7. Codeforces 444C DZY Loves Colors(线段树)

    题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...

  8. Codeforces 85D Sum of Medians(线段树)

    题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...

  9. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

随机推荐

  1. render httprequest

    render def my_view(request):# View code here... t = loader.get_template('myapp/index.html') c = Requ ...

  2. mapInfo文件格式详解

    from:http://hotolee.blog.163.com/blog/static/3815229920098434956370 MapInfo以表(Tab)的形式存储信息,每个表是由一组Map ...

  3. Android 工具类 SharedPreferences 封装

    SharedPreferences 是 Android 数据存储方式中的一种,特别适合用来存储少量的.格式简单的数据,比如应用程序的各种配置信息,如是否打开音效,是否开启震动等等. SharedPre ...

  4. java的服务端与客户端通信(2)

    一.Socket连接与HTTP连接   1.1Socket套接字 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信 ...

  5. sql两张表关联更新字段

    记录,推荐使用第三种,个人觉得比较好 --第一种写法,之前一直用,没有在意 UPDATE sr_t_TCodeUserReciveCfg SET fUserID=a.fUserID,fImportFl ...

  6. Linux用户和用户组管理 用户组管理命令

    添加用户组命令:groupadd 命令格式: [root@localhost ~]# groupadd [选项] 组名 选项: 选项 选项说明 -g GID 指定组ID: 修改用户组命令:groupm ...

  7. 【HackerRank】Halloween party

    Change language : Alex is attending a Halloween party with his girlfriend Silvia. At the party, Silv ...

  8. Python编程-编码、变量、数据类型

    一.Python和其他语言对比 C语言最接近机器语言,因此运行效率是最高的,但需要编译. JAVA更适合企业应用. PHP适合WEB页面应用. PYTHON语言更加简洁,丰富的类库,使初学者更易实现应 ...

  9. django大全

    数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'ro ...

  10. debian内核代码执行流程(三)

    接续<debian内核代码执行流程(二)>未完成部分 下面这行输出信息是启动udevd进程产生的输出信息: [ ]: starting version 175是udevd的版本号. 根据& ...