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 ...
 
随机推荐
- hadoop  linux  杂记
			
切换到root su 修改sudo sudo + 命令 --> root权限 + 命令 su root vim /etc/sudoers ...
 - openstack ocata版(脚本)控制节点安装
			
一.初始化环境: 1.更换yum源: yum install -y wget mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS- ...
 - javascript;先弹出提示框,再跳转到其他页面。
			
context.Response.Write("<script>alert('删除成功!" + r.ToString() + "条');window.loca ...
 - Linux用户和用户组管理 用户管理相关命令
			
用户添加命令 useradd 注意: 新添加的用户如果不设定密码是不能够登录系统的 命令格式: [root@localhost ~]#useradd [选项] 用户名 选项说明: 选项 选项说明 -u ...
 - 建议40:深入掌握ConfigParser
			
# -*- coding:utf-8 -*- ''' 1.getboolean() 根据一定的规则将配置项的值转换为布尔值 getboolean() 的真值规则: 0.no.false 和off 都会 ...
 - maven项目在打war包时出现非法字符: '\ufeff' 解决方案
			
问题描述: 开发工具MyEclipse 的总体开发环境,编码格式总体设置为UTF-8,在将web项目打包的时候出现:非法字符:'\ufeff" 错误. 解决方案: 利用notePad++打开 ...
 - Centos6.5安装Mysql5.6.10
			
1. 先卸载掉老版本的mysql(linux严格区分大小写,查找的时候加上-i参数,和mysql相关的全部要卸) [root@liuchao ~]# rpm -qa | grep -i mysqlMy ...
 - maven 内置属性有哪些?该如何使用?
			
maven 共有6类内置属性: 内置属性(maven预定义,用户可以直接使用的) ${basedir}表示项目的根目录,既包含pom.xml文件的目录: ${version}表示项目版本: ${pro ...
 - 分布式技术 webservice
			
web service 是一个平台独立的.低耦合的.自包含的.基于编程的web的应用程序,可使用开发的XML(标准通用标记语言下的一个字表)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布 ...
 - 如何编写 Makefile
			
1. 目标 依赖 命令 make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的 ...