题目链接

利用期望的线性性质:

\(E(sum) = E(x_l) + E(x_{l+1})+ E(x_{l+2}) +.. E(x_r)\)

然后就考虑对于交换时两个区间元素的改动.

假设这两个区间的长度分别为\(L_1,L_2\),和为\(S_1,S_2\)

那么对于第一个区间元素的期望为.

\(E(x_i) = \dfrac{L_1 - 1}{L_1} * E(x_i) + \dfrac{1}{L_1}*\dfrac{L_2}{S_2}\)

对于第二个区间也是这样.

然后用线段树维护一下就可以了.

#include <iostream>
#include <cstdio>
#define lson now << 1
#define rson now << 1 | 1
const int maxN = 1e5 + 7; struct Node {
int l,r;
double sum,lazy,mul;
}tree[maxN << 2]; inline int read() {
int x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {if(c == '-')f = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
return x * f;
} void init(int now,int l,int r) {
tree[now].l = l;tree[now].r = r;
tree[now].mul = 1;tree[now].lazy = 0;
return ;
} void updata(int now) {
tree[now].sum = tree[lson].sum + tree[rson].sum;
return;
} void build(int now,int l,int r) {
init(now,l,r);
if(l == r) {
tree[now].sum = read();
return;
}
int mid = (l + r) >> 1;
build(lson,l,mid);
build(rson,mid + 1,r);
updata(now);
return ;
} void work(int now,double lazy,double mul) {
tree[now].lazy = tree[now].lazy * mul + lazy;
tree[now].mul = tree[now].mul * mul;
tree[now].sum = tree[now].sum * mul + lazy * (tree[now].r - tree[now].l + 1);
return ;
} void pushdown(int now) {
work(lson,tree[now].lazy,tree[now].mul);
work(rson,tree[now].lazy,tree[now].mul);
tree[now].lazy = 0;tree[now].mul = 1;
return ;
} double query(int now,int L,int R) {
if(tree[now].l >= L && tree[now].r <= R) return tree[now].sum;
int mid = (tree[now].l + tree[now].r) >> 1;
double sum = 0;
if(tree[now].lazy || tree[now].mul != 1) pushdown(now);
if(mid >= L) sum += query(lson,L,R);
if(mid < R) sum += query(rson,L,R);
return sum;
} void modify(int now,int L,int R,double lazy,double mul) {
if(tree[now].l >= L && tree[now].r <= R) {
work(now,lazy,mul);
return ;
}
if(tree[now].lazy || tree[now].mul != 1) pushdown(now);
int mid = (tree[now].l + tree[now].r) >> 1;
if(mid >= L) modify(lson,L,R,lazy,mul);
if(mid < R) modify(rson,L,R,lazy,mul);
updata(now);
return ;
} int main() {
int n,m;
n = read();m = read();
build(1,1,n);
int opt,l1,r1,l2,r2;
while(m --) {
opt = read() - 1;l1 = read();r1 = read();
if(!opt) {
l2 = read();r2 = read();
int L_1,L_2;
double S_1,S_2;
L_1 = r1 - l1 + 1;L_2 = r2 - l2 + 1;
S_1 = query(1,l1,r1);S_2 = query(1,l2,r2);
modify(1,l1,r1,1.0 / L_1 * S_2 / L_2,1.0 * (L_1 - 1) / L_1);
modify(1,l2,r2,1.0 / L_2 * S_1 / L_1,1.0 * (L_2 - 1) / L_2);
}
else printf("%.7lf\n",query(1,l1,r1));
}
return 0;
}

CF895E Eyes Closed (期望)的更多相关文章

  1. [CF895E] Eyes Closed(线段树,期望)

    Desctiption 传送门:Portal 大致题意: 给你一个序列, 支持两种操作: 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择 ...

  2. [CF895E]Eyes Closed

    luogu description 一个序列\(a_i\),支持一下两种操作. \(1\ \ l_1\ \ r_1\ \ l_2\ \ r_2\): 随机交换区间\([l_1,r_1]\)和\([l_ ...

  3. CF895 E. Eyes Closed(线段树 期望)

    题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...

  4. codeforces895E. Eyes Closed

    题目链接 codeforces895E. Eyes Closed 题解 线段树维护期望和 写出修改两区间的相互影响 就是一个区间修改 emmm考试的代码过不去,这么松的spj都过不去Orz,每次和答案 ...

  5. Codeforces 895.E Eyes Closed

    E. Eyes Closed time limit per test 2.5 seconds memory limit per test 256 megabytes input standard in ...

  6. Codeforces 895E Eyes Closed(线段树)

    题目链接  Eyes Closed 题意  两个人玩一个游戏,现在有两种操作: 1.两个人格子挑选一个区间,保证两个的区间不相交.在这两个区间里面各选出一个数,交换这两个数. 2.挑选一个区间,求这个 ...

  7. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  8. 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]

    Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...

  9. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

随机推荐

  1. (十二)SpringBoot 设置定时任务

    一:创建定时任务 创建core→tesks→tesk.java package com.example.demo.core.tasks; import org.springframework.sche ...

  2. redis连接错误

    连接redis错误:ERR Client sent AUTH, but no password is set 2018-07-04 20:33 by robinli, 4367 阅读, 0 评论, 收 ...

  3. 搭建Keepalived + Nginx + Tomcat的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  4. python异常之ModuleNotFoundError: No module named 'test01inner02'

    当我们使用sys.path.append(args) 指令向程序中导入模块时其实本次append操作只是在内存中完成的,如果要永久性的添加需要修改环境变量. 我们发现当我们使用print(sys.pa ...

  5. rpm与yum安装软件包

    首先,禁止用yum卸载删除软件包: 而应该使用rpm删除软件包 rpm qa | grep 软件包名 rpm -e --nodeps 要卸载的软件包

  6. 基于PHP的正则表达式

    用法 从某个字符抽取信息 用新文本替换匹配的文本 把字符串拆分成小块字符串组成的数组 基础 preg_match('/需要匹配的正则表达式/', '字符串'); 正则匹配模式 集合: [xxxx]-- ...

  7. Codeforces Round #533(Div. 2) D.Kilani and the Game

    链接:https://codeforces.com/contest/1105/problem/D 题意: 给n*m的地图,最多9个人,同时有每个人的扩张次数(我开始以为是直线扩张最大长度..实际是能连 ...

  8. C/C++程序员应聘常见面试题深入剖析(1)

    摘自:http://blog.csdn.net/zhoudengqing 1.引言 本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵.文中的大多数面试题来自各大论 ...

  9. js实现文本框验证和实现小数的加减乘除

    <script type="text/javascript"> //加法 var m=accAdd(1.22,1.22); //减法 var m1=accSub(1.2 ...

  10. 使用JDBC进行简单的增删改查

    JDBC为java的基础.用jdbc实现对数据库的增删改查的功能是程序员的基本要求.本例以mysql为例,首先要使用本例需要添加mysql-connector-java-5.1.7-bin.jar包. ...