CodeForces - 138C: Mushroom Gnomes - 2 (线段树&概率&排序)
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
1 1
2 2 50 50
1 1
0.5000000000
2 1
2 2 50 50
4 2 50 50
3 1
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 (线段树&概率&排序)的更多相关文章
- Codeforces 138C Mushroom Gnomes - 2 线段树
Mushroom Gnomes - 2 感觉没啥东西, 用线段树算算每个被覆盖的概率, 坑点是有很多个在同一个点. #include<bits/stdc++.h> #define LL l ...
- Codeforces 588E. A Simple Task (线段树+计数排序思想)
题目链接:http://codeforces.com/contest/558/problem/E 题意:有一串字符串,有两个操作:1操作是将l到r的字符串升序排序,0操作是降序排序. 题解:建立26棵 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- codeforces 22E XOR on Segment 线段树
题目链接: http://codeforces.com/problemset/problem/242/E E. XOR on Segment time limit per test 4 seconds ...
- Codeforces Gym 100803G Flipping Parentheses 线段树+二分
Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...
- Codeforces GYM 100114 D. Selection 线段树维护DP
D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...
- Codeforces 444C DZY Loves Colors(线段树)
题目大意:Codeforces 444C DZY Loves Colors 题目大意:两种操作,1是改动区间上l到r上面德值为x,2是询问l到r区间总的改动值. 解题思路:线段树模板题. #inclu ...
- Codeforces 85D Sum of Medians(线段树)
题目链接:Codeforces 85D - Sum of Medians 题目大意:N个操作,add x:向集合中加入x:del x:删除集合中的x:sum:将集合排序后,将集合中全部下标i % 5 ...
- [Codeforces]817F. MEX Queries 离散化+线段树维护
[Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...
随机推荐
- Meta 数据中文显示
class Meta:verbose_name='待办事项'verbose_name_plural = verbose_name这是什么意思? verbose_name指定在admin管理界面中显 ...
- FTP主动连接与被动连接
FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,应用层的协议,它基于传输层, FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而 ...
- PHP下使用Redis消息队列发布微博
phpRedisAdmin :github地址 图形化管理界面 git clone [url]https://github.com/ErikDubbelboer/phpRedisAdmin.git[ ...
- iOS NSSet 学习 “无序数组” & 去重 案例
“NSSet,NSMutableSet,和NSCountedSet类声明编程接口对象的无序集合(散列存储:在内存中的存储位置不连续). 而NSArray,NSDictionary类声明编程接口对象的有 ...
- mysql安装配置 (单个mysql安装)
mysql安装于 c盘因为有注册文件 和注册表 1.为了防止mysql数据表变大和sql日志增加 改变C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 得指 ...
- 【HackerRank】Ice Cream Parlor
Sunny and Johnny together have M dollars which they intend to use at the ice cream parlour. Among N ...
- Linux虚拟内存管理(glibc)
转:https://blog.csdn.net/tengxy_cloud/article/details/53067396 https://www.cnblogs.com/purpleraintear ...
- INSPIRED启示录 读书笔记 - 第6章 招聘产品经理
产品经理应有的特质 个人素质和态度:技术可以学习,素质却难以培养,有些素质是成功的产品经理必不可少的 对产品的热情:对产品有一种本能的热爱,是夜以继日克服困难.完善产品的动力 用户立场:能换位思考,能 ...
- mongodb index 的background 及集群的索引建立
在数据库建立索引时,默认时"foreground" 也就是前台建立索引,但是,当你的数据库数据量很大时,在建立索引的时会读取数据文件,大量的文件读写会阻止其他的操作,此时在建立索引 ...
- vi编辑器快捷键使用详解
文本编辑器是所有计算机系统中最常用的一种工具.UNIX下的编辑器有ex,sed和vi等,其中,使用最为广泛的是vi,而vi命令繁多,论坛里好像这方面的总结不多,以下稍做总结,以资共享!渴望更正和补充! ...