codeforces 895E Eyes Closed 线段树 期望 数学
来源:互联网 发布:office mac 汉化补丁 编辑:程序博客网 时间:2024/06/13 02:23
简略题意:
两种操作。
1. [l1, r1]之间随机一个数,[l2, r2]之间随机一个数,把两个交换
2. 问[l, r]区间和的数学期望是多少。
先考虑左部分区间,假设其总和为
那么对于左区间随机一个数
可以发现这其实是对
同理可得右区间的变换为:
因此我们只需要维护区间乘法,区间加法,区间求和的线段树即可。
#define others#ifdef poj#include <iostream>#include <cstring>#include <cmath>#include <cstdio>#include <algorithm>#include <vector>#include <string>#endif // poj#ifdef others#include <bits/stdc++.h>#endif // others//#define file#define all(x) x.begin(), x.end()using namespace std;const double eps = 1e-8;int dcmp(double x) { if(fabs(x)<=eps) return 0; return (x>0)?1:-1;};typedef long long LL;/*题意:两种操作。1. [l1, r1]之间随即一个数,[l2, r2]之间随机一个数,把两个交换2. 问[l, r]区间和的数学期望是多少。*/namespace solver { int n, q; const int maxn = 110000; struct A { double sum, mul, add; } tr[maxn<<2]; #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 void pushup(int rt) { tr[rt].sum = tr[rt<<1].sum + tr[rt<<1|1].sum; } void build(int l, int r, int rt) { tr[rt].sum = tr[rt].add = 0; tr[rt].mul = 1; if(l == r) { scanf("%lf", &tr[rt].sum); return ; } int m = l + r >> 1; build(lson); build(rson); pushup(rt); } void pushdown(int l, int r, int rt) { int m = l + r >> 1; tr[rt<<1].sum = tr[rt].mul * tr[rt<<1].sum + (m - l + 1) * tr[rt].add; tr[rt<<1].mul *= tr[rt].mul; tr[rt<<1].add = tr[rt].mul * tr[rt<<1].add + tr[rt].add; tr[rt<<1|1].sum = tr[rt].mul * tr[rt<<1|1].sum + (r - m) * tr[rt].add; tr[rt<<1|1].mul *= tr[rt].mul; tr[rt<<1|1].add = tr[rt].mul * tr[rt<<1|1].add + tr[rt].add; tr[rt].add = 0; tr[rt].mul = 1; } void update_mul(int L, int R, double v, int l, int r, int rt) { if(L <= l && R >= r) { tr[rt].sum *= v; tr[rt].mul *= v; tr[rt].add *= v; return ; } pushdown(l, r, rt); int m = l + r >> 1; if(L <= m) update_mul(L, R, v, lson); if(R > m) update_mul(L, R, v, rson); pushup(rt); } void update_add(int L, int R, double v, int l, int r, int rt) { if(L <= l && R >= r) { tr[rt].sum += (r - l + 1) * v; tr[rt].add += v; return ; } pushdown(l, r, rt); int m = l + r >> 1; if(L <= m) update_add(L, R, v, lson); if(R > m) update_add(L, R, v, rson); pushup(rt); } double ask(int L, int R, int l, int r, int rt) { if(L <= l && R >= r) { return tr[rt].sum; } int m = l + r >> 1; double ans = 0; pushdown(l, r, rt); if(L <= m) ans += ask(L, R, lson); if(R > m) ans += ask(L, R, rson); pushup(rt); return ans; } void solve() { scanf("%d%d", &n, &q); build(1, n, 1); for(int i = 1; i <= q; i++) { int id; scanf("%d", &id); if(id == 1) { int l1, r1, l2, r2; scanf("%d%d%d%d", &l1, &r1, &l2, &r2); double sum1 = ask(l1, r1, 1, n, 1), sum2 = ask(l2, r2, 1, n, 1); double len1 = r1 - l1 + 1, len2 = r2 - l2 + 1; update_mul(l1, r1, (len1-1)/len1, 1, n, 1); update_mul(l2, r2, (len2-1)/len2, 1, n, 1); update_add(l1, r1, 1.0/len1 * (sum2/len2), 1, n, 1); update_add(l2, r2, 1.0/len2 * (sum1/len1), 1, n, 1); } else { int l, r; scanf("%d%d", &l, &r); printf("%.7f\n", ask(l, r, 1, n, 1)); } } };}int main() { #ifdef file freopen("gangsters.in", "r", stdin); freopen("gangsters.out", "w", stdout); #endif // file solver::solve(); return 0;}/*5 51 2 3 4 5*/
阅读全文
0 0
- codeforces 895E Eyes Closed 线段树 期望 数学
- Codeforces Round #448 (Div. 2) E. Eyes Closed(线段树)
- Codeforces Round #448 (Div. 2) E. Eyes Closed
- codeforces 268E Playlist(数学期望)
- *【codeforces】数学期望
- CodeForces - 292E 线段树
- codeforces 400e 线段树
- 线段树 CodeForces 580E
- codeforces 413E 线段树
- codeforces 242E(线段树)
- codeforces 621C(数学期望)
- codeforces 730E (数学)
- codeforces 733E (数学)
- codeforces 111 160E 线段树
- Codeforces 384E 线段树+dfs序
- 【CodeForces】35E Parade 线段树
- CodeForces 292E Copying Data (线段树)
- codeforces 474E Pillars(线段树+dp)
- 使用纹理制作特效
- python 将图片转换为字符串
- 软件调试笔记15
- Java 匿名内部类
- 阻止360浏览器拖拽链接打开新的页面
- codeforces 895E Eyes Closed 线段树 期望 数学
- jsp里怎么获取function里的值 在input里用
- 1.一个RestFul的helloworld
- iOS
- Mac Android Studio SVN配置
- FMDB使用
- 一次CMS GC问题排查过程(理解原理+读懂GC日志)
- Java继承关系是否合理的判别
- 基数排序(c)