[CF895E]Eyes Closed
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的更多相关文章
- [CF895E] Eyes Closed(线段树,期望)
Desctiption 传送门:Portal 大致题意: 给你一个序列, 支持两种操作: 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择 ...
- CF895E Eyes Closed (期望)
题目链接 利用期望的线性性质: \(E(sum) = E(x_l) + E(x_{l+1})+ E(x_{l+2}) +.. E(x_r)\) 然后就考虑对于交换时两个区间元素的改动. 假设这两个区间 ...
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]
Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...
- Resource leak: 'context' is never closed
from: http://stackoverflow.com/questions/14184059/spring-applicationcontext-resource-leak-context-is ...
- 开放封闭原则(Open Closed Principle)
在面向对象的设计中有很多流行的思想,比如说 "所有的成员变量都应该设置为私有(Private)","要避免使用全局变量(Global Variables)",& ...
- ORA-12537: TNS:connection closed
http://www.vitalsofttech.com/ora-12537-tnsconnection-closed/ Question: When trying to establish a sq ...
- 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 ...
- SQLExecption:Operation not allowed after ResultSet closed解决办法
原网址:http://blog.csdn.net/sku0923/article/details/1722370 一个stmt多个rs进行操作引起的ResultSet已经关闭错误 一个stmt多个rs ...
随机推荐
- 使用@media screen解决移动web开发的多分辨率问题
当今移动设备的发展已经越来越迅速,移动web开发的需求也越来越多多.许多大平台.大门户都纷纷推出了自己的移动web版网站. 随着移动设备飞速的发展,移动产品的屏幕规格越来越多.从几年前的320×240 ...
- 英语每日写作---4、VOA慢速英语(翻译+字幕+讲解):专家:城市发展将加剧住房危机
英语每日写作---4.VOA慢速英语(翻译+字幕+讲解):专家:城市发展将加剧住房危机 一.总结 一句话总结: takes place 发生deal with 处理:应付population grow ...
- 设计模式--代理模式C++实现
代理模式C++实现 1定义 为其他对象提供一种代理以控制对这个对象的访问 2类图 角色定义: Subject抽象主体角色,抽象类或者接口,是一个普通的业务类型定义 RealSubject具体主体角色, ...
- 【Demo】jQuery 设置简单的分页
功能描述: (1)设定起始页位置和每页的大小: (2)绑定自定义的分页事件,在事件中隐藏当前页不需要显示的行: (3)为表格添加页链接: (4)绑定链接的单击事件,在事件中触发表格分页事件. 效果图: ...
- hdu4305生成树计数
先预处理出距离,然后判断是否可行,要注意判断是否在一条直线上时判断是在两侧还是一边(wa了四次) double型数据 #include<map> #include<set> # ...
- 1-24-case流程控制和while循环语句的使用
大纲: 1.while循环控制语句 while实战---批量添加规则用户 while实战---猜价格游戏 2.case流程控制语句和exit退出 exit实战---返回值测试 case实战---智能解 ...
- HDU 4739 Zhuge Liang's Mines (状态压缩+背包DP)
题意 给定平面直角坐标系内的N(N <= 20)个点,每四个点构成一个正方形可以消去,问最多可以消去几个点. 思路 比赛的时候暴力dfs+O(n^4)枚举写过了--无意间看到有题解用状压DP(这 ...
- KMP算法(改进后的字符串匹配算法)
转载:http://blog.csdn.net/liu88010988/article/details/50789960 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O ...
- Find the odd int
Given an array, find the int that appears an odd number of times. There will always be only one inte ...
- tornado源码分析系列一
先来看一个简单的示例: #!/usr/bin/env python #coding:utf8 import socket def run(): sock = socket.socket(socket. ...