题目链接

利用期望的线性性质:

\(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. hyperledger fabric 1.0.5 分布式部署 (六)

    如何在相同的peer 节点上创建多个 channel 作者在hyperledger fabric 1.0.5 分布式部署 (五)已经向读者们介绍了一个简单的fabric 的部署流程,那么根据上一篇博客 ...

  2. CentOS(6、7)修改主机名(hostname)

    centos6需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户. /etc/sysconfig/n ...

  3. day04 基本类型包装类

  4. python模块之struct

    # #********struct模块********# # 1.按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时, # 不能传输int,此时先将int转化为字节流,然后再发 ...

  5. netty与MQ使用心得

    最近在做分布式的系统,使用netty与mq进行远程RPC调用,现将心得经验总结一下. 我们公司的服务器在云端机房,在每一个店面有一个服务器,店面服务器外网无法访问. 我们的做法是店面服务器在启动时与云 ...

  6. Codeforces 526F Pudding Monsters

    先把题目抽象一下: 有一个静态的数组,求有多少个区间[i,j]满足:j-i==max{ai,...,aj}-min{ai,...,aj} 也就是要求max-min+i-j==0的区间数 所以肿么做呢? ...

  7. windows安装redis和PHP redis扩展

    1.安装Redis (1)这里选择在github官网上下载Redis,地址:Redis下载地址 下载压缩包(如下图),并解压到本地目录,我放在D:\wamp\redis\redis-windows ( ...

  8. 本地连接远程Oracle数据库

    由于项目开发测试,需要在本地连接远程的Oracle数据库 之前搭过环境,但是重装了系统,现在又重新装一遍 软件安装 连接远程Oracle需要两个软件: 一个Oracle客户端,instantclien ...

  9. Access denied for user ''@'localhost' to database 的一个问题

    $conn = new mysqli("127.0.0.1", 'abc', '', DB_DATABASE); 在提供了用户名的情况下,竟然返回错误 说用户提供的用户为空,非常奇 ...

  10. 文件操作,Io流。

    private void textBox1_TextChanged(object sender, EventArgs e) { } private void button1_Click(object ...