题目链接  Eyes Closed

题意  两个人玩一个游戏,现在有两种操作:

1、两个人格子挑选一个区间,保证两个的区间不相交。在这两个区间里面各选出一个数,交换这两个数。

2、挑选一个区间,求这个区间的和的期望。

对于第一种操作,先求出两个区间的长度$len1$和$len2$,再求出两个区间的期望和$s1$和$s2$。

对于第一个区间,我们先把这个区间里的所有数(期望值)乘上$(len1 - 1)/(len1)$,再加上$s2/len1/len2$

对于第二个区间,我们先把这个区间里的所有数(期望值)乘上$(len2 - 1)/(len2)$,再加上$s1/len1/len2$

线段树维护这两个操作即可。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define ls (i << 1)
#define rs (i << 1 | 1)
#define mid ((L + R) >> 1)
#define lson i << 1, L, mid
#define rson i << 1 | 1, mid + 1, R typedef long long LL; const int N = 4e5 + 10; double add[N], mul[N], s[N];
int n, q; void pushup(int i){ s[i] = s[ls] + s[rs]; } void pushdown(int i, int L, int R){
s[ls] = mul[i] * s[ls] + add[i] * (mid - L + 1);
mul[ls] *= mul[i];
add[ls] = mul[i] * add[ls] + add[i];
s[rs] = mul[i] * s[rs] + add[i] * (R - mid);
mul[rs] *= mul[i];
add[rs] = mul[i] * add[rs] + add[i];
add[i] = 0;
mul[i] = 1.0;
} void build(int i, int L, int R){
add[i] = 0, mul[i] = 1;
s[i] = 0;
if (L == R){ scanf("%lf", s + i); return; }
build(lson);
build(rson);
pushup(i);
} void add_update(int i, int L, int R, int l, int r, double val){
if (l <= L && R <= r){
s[i] += (R - L + 1) * val;
add[i] += val;
return;
} pushdown(i, L, R);
if (l <= mid) add_update(lson, l, r, val);
if (r > mid) add_update(rson, l, r, val);
pushup(i);
} void mul_update(int i, int L, int R, int l, int r, double val){
if (l <= L && R <= r){
s[i] *= val;
mul[i] *= val;
add[i] *= val;
return;
} pushdown(i, L, R);
if (l <= mid) mul_update(lson, l, r, val);
if (r > mid) mul_update(rson, l, r, val);
pushup(i);
} double query(int i, int L, int R, int l, int r){
if (l <= L && R <= r) return s[i];
double ret = 0;
pushdown(i, L, R);
if (l <= mid) ret += query(lson, l, r);
if (r > mid) ret += query(rson, l, r);
pushup(i);
return ret;
} int main(){ scanf("%d%d", &n, &q);
build(1, 1, n); while (q--){
int op;
scanf("%d", &op);
if (op == 1){
int l1, r1, l2, r2;
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
double s1 = query(1, 1, n, l1, r1);
double s2 = query(1, 1, n, l2, r2);
double len1 = r1 - l1 + 1;
double len2 = r2 - l2 + 1;
mul_update(1, 1, n, l1, r1, 1.0 * (len1 - 1) / len1);
mul_update(1, 1, n, l2, r2, 1.0 * (len2 - 1) / len2);
add_update(1, 1, n, l1, r1, 1.0 / len1 / len2 * s2);
add_update(1, 1, n, l2, r2, 1.0 / len1 / len2 * s1);
} else{
int l, r;
scanf("%d%d", &l, &r);
printf("%.12f\n", query(1, 1, n, l, r));
}
} return 0;
}

Codeforces 895E Eyes Closed(线段树)的更多相关文章

  1. Buses and People CodeForces 160E 三维偏序+线段树

    Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...

  2. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  3. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  4. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  5. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

  6. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  7. Codeforces 482B Interesting Array(线段树)

    题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...

  8. codeforces 383C Propagating tree 线段树

    http://codeforces.com/problemset/problem/383/C 题目就是说,  给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...

  9. CodeForces 228D. Zigzag(线段树暴力)

    D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...

随机推荐

  1. [译]The Python Tutorial#5. Data Structures

    [译]The Python Tutorial#Data Structures 5.1 Data Structures 本章节详细介绍之前介绍过的一些内容,并且也会介绍一些新的内容. 5.1 More ...

  2. Altium Designer入门学习笔记4:PCB设计中各层的含义

    阻焊层:solder mask,是指板子上要上绿油的部分:因为它是负片输出,所以实际上有solder mask的部分实际效果并不上绿油,而是镀锡,呈银白色! 助焊层:paste mask,是机器贴片时 ...

  3. Windows7_64位 NVIDIA 卡 OpenCl环境配置

    序 最近做一个项目需要用到OpenCL,由于之前没有接触过,所以在环境配置第一关就遇到了一些问题,查阅很多资料才配置完成,现在记录如下,希望给一些童鞋一些帮助. 整个步骤也很简单: 了解系统配置,选择 ...

  4. hdu 6318

    Long long ago, there was an integer sequence a.Tonyfang think this sequence is messy, so he will cou ...

  5. Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析

    CTS Verifier算是CTS的一部分,需要手动进行,主要用于测试那些自动测试系统无法测试的功能,比如相机.传感器等.由于硬件配置或其他原因,不同手机上部分测试项目被隐藏,也就是说CTS Veri ...

  6. POJ2594拐点弯的二分

    开始读题没理解题意,以为就是覆盖,可是怎么交都不对... 我就气愤了,结果去百度了一下发现奶奶的这题的机器人是可以隔点瞭望的,例如1->2->3.2->4.5->2  这个图 ...

  7. bootstrap 弹出框(Popover)插件 修改title等属性选项值

    <button type="button" class="btn btn-default ht-btn" data-toggle="popove ...

  8. 修改const变量

    看下面的一段代码 ; int * j=(int*)(&i); // 运行正确,j确为i的地址,但 int *j=&i; 编译错误 *j=; //确实改变了i的值 printf(&quo ...

  9. 探究灰度测试(A/B Testing)

    一段小插曲 前段时间产品改版,产品经理为了改进用户体验,就决定改版用户的注册流程页面,但又怕身份证注册验证接口不稳定(第三方的身份证校验). 于是产品经理就让我通过随机概率去控制注册流程,让一部分用户 ...

  10. set的特性和基本用法——python3.6

    特性 无序,不重复的数据组合,用{}表示,eg:{1,2,3,4,5,6} 用途 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之间的交集,差集,并集,对称差集,包含(子集和超集,相交 ...