luogu

description

一个序列\(a_i\),支持一下两种操作。

\(1\ \ l_1\ \ r_1\ \ l_2\ \ r_2\): 随机交换区间\([l_1,r_1]\)和\([l_2,r_2]\)中的两个值。

\(2\ \ l\ \ r\):查询\(\sum_{i=l}^ra_i\)的期望。

sol

设两个交换区间的和分别是\(s_1,s_2\),长度分别是\(len_1,len_2\)。

考虑区间\([l_1,r_1]\)中的一个元素\(x\),在交换后它的期望值会变为:

\(\frac{len_1-1}{len_1}x+\frac{1}{len_1}\times\frac{s_2}{len_2}\)

区间\([l_2,r_2]\)中的数同理,会变成:

\(\frac{len_2-1}{len_2}x+\frac{1}{len_2}\times\frac{s_1}{len_1}\)

所以线段树支持区间加区间乘区间求和即可。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 2e5+5;
int n,m;double sum[N<<2],pls[N<<2],mul[N<<2];
void build(int x,int l,int r){
if (l==r) {sum[x]=gi();return;}
int mid=l+r>>1;mul[x]=1;
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
sum[x]=sum[x<<1]+sum[x<<1|1];
}
void cover_pls(int x,int l,int r,double v){
sum[x]+=v*(r-l+1);pls[x]+=v;
}
void cover_mul(int x,double v){
sum[x]*=v;mul[x]*=v;pls[x]*=v;
}
void pushdown(int x,int l,int r){
int mid=l+r>>1;
cover_mul(x<<1,mul[x]),cover_mul(x<<1|1,mul[x]);
cover_pls(x<<1,l,mid,pls[x]),cover_pls(x<<1|1,mid+1,r,pls[x]);
pls[x]=0;mul[x]=1;
}
void modify_pls(int x,int l,int r,int ql,int qr,double v){
if (l>=ql&&r<=qr) {cover_pls(x,l,r,v);return;}
pushdown(x,l,r);int mid=l+r>>1;
if (ql<=mid) modify_pls(x<<1,l,mid,ql,qr,v);
if (qr>mid) modify_pls(x<<1|1,mid+1,r,ql,qr,v);
sum[x]=sum[x<<1]+sum[x<<1|1];
}
void modify_mul(int x,int l,int r,int ql,int qr,double v){
if (l>=ql&&r<=qr) {cover_mul(x,v);return;}
pushdown(x,l,r);int mid=l+r>>1;
if (ql<=mid) modify_mul(x<<1,l,mid,ql,qr,v);
if (qr>mid) modify_mul(x<<1|1,mid+1,r,ql,qr,v);
sum[x]=sum[x<<1]+sum[x<<1|1];
}
double query(int x,int l,int r,int ql,int qr){
if (l>=ql&&r<=qr) return sum[x];
pushdown(x,l,r);int mid=l+r>>1;double res=0;
if (ql<=mid) res+=query(x<<1,l,mid,ql,qr);
if (qr>mid) res+=query(x<<1|1,mid+1,r,ql,qr);
return res;
}
int main(){
n=gi();m=gi();build(1,1,n);
while (m--){
int opt=gi();
if (opt==1){
int a=gi(),b=gi(),c=gi(),d=gi();
double l1=b-a+1,l2=d-c+1;
double s1=query(1,1,n,a,b),s2=query(1,1,n,c,d);
modify_mul(1,1,n,a,b,(l1-1)/l1);
modify_mul(1,1,n,c,d,(l2-1)/l2);
modify_pls(1,1,n,a,b,1.0/l1*(s2/l2));
modify_pls(1,1,n,c,d,1.0/l2*(s1/l1));
}else{
int a=gi(),b=gi();
printf("%.5lf\n",query(1,1,n,a,b));
}
}
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 (期望)

    题目链接 利用期望的线性性质: \(E(sum) = E(x_l) + E(x_{l+1})+ E(x_{l+2}) +.. E(x_r)\) 然后就考虑对于交换时两个区间元素的改动. 假设这两个区间 ...

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

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

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

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

  5. Resource leak: 'context' is never closed

    from: http://stackoverflow.com/questions/14184059/spring-applicationcontext-resource-leak-context-is ...

  6. 开放封闭原则(Open Closed Principle)

    在面向对象的设计中有很多流行的思想,比如说 "所有的成员变量都应该设置为私有(Private)","要避免使用全局变量(Global Variables)",& ...

  7. ORA-12537: TNS:connection closed

    http://www.vitalsofttech.com/ora-12537-tnsconnection-closed/ Question: When trying to establish a sq ...

  8. EX:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

    EX:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secu ...

  9. SQLExecption:Operation not allowed after ResultSet closed解决办法

    原网址:http://blog.csdn.net/sku0923/article/details/1722370 一个stmt多个rs进行操作引起的ResultSet已经关闭错误 一个stmt多个rs ...

随机推荐

  1. 将springboot项目发布到独立的tomcat中运行

    在开发阶段我们推荐使用内嵌的tomcat进行开发,因为这样会方便很多,但是到生成环境,我希望在独立的tomcat容器中运行,因为我们需要对tomcat做额外的优化,这时我们需要将工程打包成war包发进 ...

  2. IOS-Storyboard全解析-第二部分

    [IOS] Storyboard全解析-第二部分 如果你想了解更多Storyboard的特性,那么你就来对了地方,下面我们就来接着上次的内容详细讲解Storyboard的使用方法. 在上一篇<S ...

  3. OGRE渲染流程

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/

  4. apache shiro整合spring(一)

    apache shiro整合spring 将shiro配置文件整合到spring体系中 方式一:直接在spring的配置文件中import shiro的配置文件 方式二:直接在web.xml中配置sh ...

  5. 使用IScroll5实现滚动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 多线程-Thread、Runnable 创建线程和调用过程分析

    创建线程的两种方式: 1:创建Thread类的子类 ---基于继承的技术 . 2:以Runnable接口实例为构造参数直接通过new  创建 Thread 实例.---基于组合的技术. public ...

  7. 过滤器(Filter)

    1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如 ...

  8. Linux之LVM设备的管理

    LVM可以理解为可扩展的设备:在设备空间不足的时候,保证其在原始数据不变的情况下增大设备的存储大小.那么,要达到这种效果,我们得把可用设备先比变为物理卷,再把物理卷处理为物理卷组,最后成为LVM逻辑卷 ...

  9. getaddrinfo()详解

    IPv4中使用gethostbyname()函数完成主机名到地址解析,但是该API不允许调用者指定所需地址类型的任何信息,返回的结构只包含 了用于存储IPv4地址的空间.为了解决该问题,IPv6中引入 ...

  10. mybatis入参方式和缓冲

    1.mybatis入参方式 @Param注解参数(注解) 封装成对象入参 public int updatePassword(@Param("id")int id,@Param(& ...