Codeforces 138C(区间更新+离散化)
2015-08-17 17:58
288 查看
题意:有n棵树在水平线上,给出每棵树的坐标和高度,然后向左倒的概率和向右倒的概率,和为1,然后给出了m个蘑菇的位置,每个蘑菇都有一个魔法值,如果蘑菇被压死了,也就是在某棵树[a[i] - h[i], a[i]) 或 (a[i], a[i] + h[i]]范围内,魔法值就没有了,只有生存下来的蘑菇才有魔法值,问生存下来的蘑菇的魔法值的期望。
题解:可以看到n和m的范围是1e5,而坐标范围是1e9,所以肯定要离散化,然后更新每个区间的概率值,单点查询每个蘑菇所在区间的概率值乘其魔法值。
题解:可以看到n和m的范围是1e5,而坐标范围是1e9,所以肯定要离散化,然后更新每个区间的概率值,单点查询每个蘑菇所在区间的概率值乘其魔法值。
#include <cstdio> #include <cstring> #include <algorithm> #include <map> using namespace std; const int N = 100005; int n, m, a , h , b , z , c[N << 2]; double tree[N << 4], flag[N << 4], pl , pr ; map<int, int> mp; void pushdown(int k) { if (flag[k]) { tree[k * 2] *= tree[k]; tree[k * 2 + 1] *= tree[k]; flag[k * 2] = flag[k * 2 + 1] = 1; tree[k] = 1.0; flag[k] = 0; } } void build(int k, int left, int right) { flag[k] = 0; tree[k] = 1.0; if (left != right) { int mid = (left + right) / 2; build(k * 2, left, mid); build(k * 2 + 1, mid + 1, right); } } void modify(int k, int left, int right, int l1, int r1, double x) { if (l1 <= left && right <= r1) { tree[k] *= x; flag[k] = 1; return; } pushdown(k); int mid = (left + right) / 2; if (l1 <= mid) modify(k * 2, left, mid, l1, r1, x); if (r1 > mid) modify(k * 2 + 1, mid + 1, right, l1, r1, x); } double query(int k, int left, int right, int pos) { if (left == right) return tree[k]; pushdown(k); int mid = (left + right) / 2; if (pos <= mid) return query(k * 2, left, mid, pos); else return query(k * 2 + 1, mid + 1, right, pos); } int main() { scanf("%d%d", &n, &m); mp.clear(); int cnt = 0; for (int i = 1; i <= n; i++) { scanf("%d%d%lf%lf", &a[i], &h[i], &pl[i], &pr[i]); pl[i] /= 100.0, pr[i] /= 100.0; c[++cnt] = a[i]; c[++cnt] = a[i] - h[i]; c[++cnt] = a[i] + h[i]; } for (int i = 1; i <= m; i++) { scanf("%d%d", &b[i], &z[i]); c[++cnt] = b[i]; } sort(c + 1, c + 1 + cnt); cnt = unique(c + 1, c + 1 + cnt) - (c + 1); for (int i = 1; i <= cnt; i++) mp[c[i]] = i; build(1, 1, cnt); for (int i = 1; i <= n; i++) { modify(1, 1, cnt, mp[a[i] - h[i]], mp[a[i]] - 1, 1.0 - pl[i]); modify(1, 1, cnt, mp[a[i]] + 1, mp[a[i] + h[i]], 1.0 - pr[i]); } double res = 0; for (int i = 1; i <= m; i++) res += z[i] * query(1, 1, cnt, mp[b[i]]); printf("%lf\n", res); return 0; }
相关文章推荐
- QTP显示TestFlow
- HttpSessionListener进行同名用户剔除登录的方法
- UVALive 3211 Now or later || 2-sat + 二分
- WAS缓存问题
- iOS 逆向之ARM汇编
- UE4 Material Properties
- Java快速开发平台:J-Hi
- nginx配置location总结及rewrite规则写法
- 搭建Docker私有仓库的详细教程
- 遍历Map的四种方法
- XCode 开发去除 UserInterfaceState.xcuserstate 文件为版本控制(git、svn)带来的困扰
- Android Studio Building 'xxx' Gradle project info
- UE3 材质概述
- 几个关于网站架构和性能的问题(我在知乎上的问答)
- Linux系统下安装配置jdk
- Linux中如何安装loadgenerator
- [转]Python、Django以及PyCharm安装心得
- H.264 RTP PAYLOAD 格式
- 编程之美电梯调度问题
- 聚焦GPUBoost 揭密GTX680最革命性变化