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 — aihiliri (|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 bjzj (|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. LVM逻辑磁盘管理

    一.简介 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵 ...

  2. PHP......会话控制SESSION与COOKIE

    一.SESSION Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 ...

  3. 【leetcode刷题笔记】Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  4. 【iOS和HTML 5交互】iOS中加载html5调用html方法和修改html5内容

    近期项目开发中用到了这方面的技术了,那我们一起来看看. 1.利用webView控件加载本地html5或者网络上html5 2.设置控制器为webView的代理,遵守协议 3.实现代理方法webView ...

  5. Ubuntu 使用国内apt源

    编辑/etc/apt/source-list deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe mult ...

  6. jquery开发js插件

    1.需要掌握的知识点 1)(function($){...}(jQuery)):实际上就是匿名函数并且函数用()阔起来,形成闭包,外界对其内部函数没有影响 $(function(){…});   jQ ...

  7. php-fpm docker 容器 搭建

    继续上一篇文章(centos 7 容器的搭建) 下面构建一个php-fpm镜像: dockerfile 文件如下: # # MAINTAINER # DOCKER-VERSION # # Docker ...

  8. Phoenix表和索引分区数对插入和查询性能的影响

    1. 概述 1.1 HBase概述 HBase由master节点和region server节点组成.在100-105集群上,100和101是master节点,102-105是region serve ...

  9. 运行tomcat,报错:Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误

    运行tomcat时,报错: Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误 原因分析: 这是因为之前已开启了一 ...

  10. QT 多页面切换之QTabWidget

    //mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QTabWidget; class  ...