E. Eyes Closed
time limit per test

2.5 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Vasya and Petya were tired of studying so they decided to play a game. Before the game begins Vasya looks at array a consisting of n integers. As soon as he remembers all elements of a the game begins. Vasya closes his eyes and Petya does q actions of one of two types:

1) Petya says 4 integers l1, r1, l2, r2 — boundaries of two non-intersecting segments. After that he swaps one random element from the [l1, r1]segment with another random element from the [l2, r2] segment.

2) Petya asks Vasya the sum of the elements of a in the [l, r] segment.

Vasya is a mathematician so he answers Petya the mathematical expectation of the sum of the elements in the segment.

Your task is to write a program which will answer the second type questions as Vasya would do it. In other words your program should print the mathematical expectation of the sum of the elements of a in the [l, r] segment for every second type query.

Input

The first line contains two integers n, q (2 ≤ n ≤ 105, 1 ≤ q ≤ 105)  — the number of elements in the array and the number of queries you need to handle.

The second line contains n integers ai (1 ≤ ai ≤ 109)  — elements of the array.

The next q lines contain Petya's actions of type 1 or 2.

If it is a type 1 action then the line contains 5 integers 1, l1, r1, l2, r2 (1 ≤ l1 ≤ r1 ≤ n, 1 ≤ l2 ≤ r2 ≤ n).

If it is a type 2 query then the line contains 3 integers 2, l, r (1 ≤ l ≤ r ≤ n).

It is guaranteed that there is at least one type 2 query and segments [l1, r1], [l2, r2] don't have common elements.

Output

For each type 2 query print one real number — the mathematical expectation of the sum of elements in the segment.

Your answer will be considered correct if its absolute or relative error doesn't exceed 10 - 4  — formally, the answer is correct if  where x is jury's answer and y is yours.

Examples
input
4 4
1 1 2 2
1 2 2 3 3
2 1 2
1 1 2 3 4
2 1 2
output
3.0000000
3.0000000
input
10 5
1 1 1 1 1 2 2 2 2 2
1 1 5 6 10
2 1 5
1 1 5 6 10
1 1 5 6 10
2 6 10
output
6.0000000
8.0400000
input
10 10
1 2 3 4 5 6 7 8 9 10
1 1 5 6 10
1 1 5 6 10
2 1 5
1 1 3 6 9
2 1 3
1 5 7 8 10
1 1 1 10 10
2 1 5
2 7 10
2 1 10
output
23.0000000
14.0000000
28.0133333
21.5733333
55.0000000

大致题意:两种操作。 
1. [l1, r1]之间随机一个数,[l2, r2]之间随机一个数,把两个交换 
2. 问[l, r]区间和的数学期望是多少。

分析:直接分析每个数对整体的影响很难,先分析个体.设len1 = r1 - l1 + 1,len2 = r2 - l2 + 1.那么对于第一个区间的数x,有1/len1的概率随机到.还有(len1 - 1)/len1的概率不会随机到.右边有1/len2的概率随机到y,那么既随机到x又随机到y的概率为1/(len1*len2),枚举第二个区间的每一个数y,那么x对第一个区间的期望的贡献就变成了[(len1 - 1)/len1] * x + sum2 / (len1 * len2).整个区间的期望和就是把所有x的期望加起来.可以利用线段树来维护:区间乘,区间加,区间求和,对于第二个区间也是差不多这样的.

对期望的概念理解的还不是非常深入.直接算整体的不好算可以先考虑算局部的贡献.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; int n,q,L[maxn << ],R[maxn << ];
double sum[maxn << ],add[maxn << ],mul[maxn << ]; void pushup(int o)
{
sum[o] = sum[o * ] + sum[o * + ];
} void pushdown(int o)
{
sum[o * ] = sum[o * ] * mul[o] + add[o] * (R[o * ] - L[o * ] + );
sum[o * + ] = sum[o * + ] * mul[o] + add[o] * (R[o * + ] - L[o * + ] + );
add[o * ] = add[o * ] * mul[o] + add[o];
add[o * + ] = add[o * + ] * mul[o] + add[o];
mul[o * ] = mul[o * ] * mul[o];
mul[o * + ] = mul[o * + ] * mul[o];
mul[o] = ;
add[o] = ;
} void build(int o,int l,int r)
{
L[o] = l;
R[o] = r;
add[o] = ;
mul[o] = ;
if (l == r)
{
cin >> sum[o];
return;
}
int mid = (l + r) >> ;
build(o * ,l,mid);
build(o * + ,mid + ,r);
pushup(o);
} double query(int o,int l,int r,int x,int y)
{
if (x <= l && r <= y)
return sum[o];
pushdown(o);
int mid = (l + r) >> ;
double res = 0.0;
if (x <= mid)
res += query(o * ,l,mid,x,y);
if (y > mid)
res += query(o * + ,mid + ,r,x,y);
return res;
} void update1(int o,int l,int r,int x,int y,double v)
{
if (x <= l && r <= y)
{
sum[o] += v * (r - l + );
add[o] += v;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update1(o * ,l,mid,x,y,v);
if (y > mid)
update1(o * + ,mid + ,r,x,y,v);
pushup(o);
} void update2(int o,int l,int r,int x,int y,double v)
{
if (x <= l && r <= y)
{
add[o] *= v;
sum[o] *= v;
mul[o] *= v;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update2(o * ,l,mid,x,y,v);
if (y > mid)
update2(o * + ,mid + ,r,x,y,v);
pushup(o);
} int main()
{
scanf("%d%d",&n,&q);
build(,,n);
while (q--)
{
int l1,r1,l2,r2;
int id;
scanf("%d",&id);
if (id == )
{
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
double sum1 = query(,,n,l1,r1),sum2 = query(,,n,l2,r2);
double len1 = r1 - l1 + ,len2 = r2 - l2 + ;
update2(,,n,l1,r1,(len1 - ) / len1);
update2(,,n,l2,r2,(len2 - ) / len2);
update1(,,n,l1,r1,1.0 / len1 * (sum2 / len2));
update1(,,n,l2,r2,1.0 / len2 * (sum1 / len1));
}
else
{
scanf("%d%d",&l1,&r1);
printf("%.7lf\n",query(,,n,l1,r1));
}
} return ;
}

Codeforces 895.E Eyes Closed的更多相关文章

  1. Codeforces 895.D String Mark

    D. String Mark time limit per test 4 seconds memory limit per test 256 megabytes input standard inpu ...

  2. Codeforces 895.C Square Subsets

    C. Square Subsets time limit per test 4 seconds memory limit per test 256 megabytes input standard i ...

  3. Codeforces 895.B XK Segments

    B. XK Segments time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. Codeforces 895.A Pizza Separation

    A. Pizza Separation time limit per test 1 second memory limit per test 256 megabytes input standard ...

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

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

  6. Codeforces GYM 100114 B. Island 水题

    B. Island Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description O ...

  7. Codeforces Gym 100338C C - Important Roads tarjan

    C - Important RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...

  8. Codeforces Round #257 (Div. 1)A~C(DIV.2-C~E)题解

    今天老师(orz sansirowaltz)让我们做了很久之前的一场Codeforces Round #257 (Div. 1),这里给出A~C的题解,对应DIV2的C~E. A.Jzzhu and ...

  9. Codeforces Round #426 (Div. 2)【A.枚举,B.思维,C,二分+数学】

    A. The Useless Toy time limit per test:1 second memory limit per test:256 megabytes input:standard i ...

随机推荐

  1. 2019CSUST集训队选拔赛题解(三)

    PY学长的放毒题 Description 下面开始PY的香港之行,PY有n个要去的小吃店,这n个小吃店被m条路径联通起来. PY有1个传送石和n−1个传送石碎片. PY可以用传送石标记一个小吃店作为根 ...

  2. spring第一章

    spring第一章 一.概述 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的 ...

  3. 在jre1.8版本下,使用ikvm将jar转换为dll,以供c#调用

    由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件(心塞..),终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. ...

  4. component-scan标签的use-default-filters属性的作用以及原理分析

    一.背景 ​ 我们在Spring+SpringMVC+Mybatis的集成开发中,经常会遇到事务配置不起作用等问题,有时候就是因为包扫描出了问题,其中component-scan的标签的use-def ...

  5. “我爱淘”第二冲刺阶段Scrum站立会议4

    完成任务: 完成了首页中的推荐功能,推荐的是最近添加的需要卖的书,注册功能实现了它,可以对数据库进行添加. 计划任务: 在客户端实现分类功能,通过学院的分类查看书籍. 遇到问题: 分类功能,根据不同学 ...

  6. 我是IT小小鸟读书笔记

    阅读了我是IT小小鸟后发现,自己开发程序是真的很苦难的,在现在这个空对空的时期,我们学习到大部分的全都是理论知识,而没有真正的去进行实践.没有经过实践,我们在程序开发过程中也就无法发现自身的困难. 在 ...

  7. 【UNIX环境高级编程】线程同步

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图.如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题.同样,如果变量是只读的也不会有一致性问题.但是,当一个线程可 ...

  8. adb使用过程常见的几种错误总结

    问题1:Failure [INSTALL_FAILED_ALREADY_EXISTS] 问题原因:该程序已存在. 解决方法:增加-r参数,即可成功覆盖安装 问题2:Failure [INSTALL_F ...

  9. HDU3507_Print Article

    这个题目又是一个典型的dp斜率优化的题目.题意是给你n个数,你需要做的是把这个n个数分为连续的若干段,每段的权值为这段数字的和的平方加上M.求最小的总权值. 我们可以根据题意写出朴素版的dp状态转移方 ...

  10. BZOJ 1965 洗牌(扩展欧几里得)

    容易发现,对于牌堆里第x张牌,在一次洗牌后会变成2*x%(n+1)的位置. 于是问题就变成了求x*2^m%(n+1)=L,x在[1,n]范围内的解. 显然可以用扩展欧几里得求出. # include ...