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. Java Basic&Security Tools

    JDK Tools and Utilities Basic Tools These tools are the foundation of the JDK. They are the tools yo ...

  2. 该用哪个:Redis与Memcached之间如何选择呢?

    华为云分布式缓存Redis5.0和Memcached都是华为云DCS的核心产品. 那么在不同的使用场景之下,如何选择Redis5.0和Memcached呢? 就由小编为大家进行详细的数据对比分析吧 R ...

  3. PHP使用static关键字声明静态属性和静态方法

    PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...

  4. Linux学习——echo和read命令用法

    转载自http://www.runoob.com/linux/linux-comm-read.html http://www.178linux.com/76331 echo命令 本文列举了echo命令 ...

  5. Linux下使用vim编辑C程序

    这几天在系统能力班自学linux,加上最近大数据课上开始使用linux,我在这里总结一下,linux下使用vim编辑c程序的一些问题. 大数据课上是直接使用micro来编辑的,我这里只是简单的说明一下 ...

  6. 超级迷宫需求分析与建议-NABCD模型

    超级迷宫需求分析与建议-NABCD模型 制作者-姜中希 1N-Need 需求  首先这是一个手机游戏风靡的时代,随着智能手机不断的更新问世,4G网络的不断扩大普及,越来越多的手机游戏受到广大玩家的追捧 ...

  7. MyEclipse快捷方式

    选择你要注释的那一行或多行代码,按Ctrl+/即可,取消注释也是选中之后按Ctrl+/即可. 如果你想使用的快捷键的注释是的话,那么你的快捷键是ctrl+shift+/我以前都是手动注释的,直接打// ...

  8. lintcode-384-最长无重复字符的子串

    384-最长无重复字符的子串 给定一个字符串,请找出其中无重复字符的最长子字符串. 样例 例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc" ...

  9. jQuery之offset,position

    获取/设置标签的位置数据 * offset(): 相对页面左上角的坐标 * position(): 相对于父元素左上角的坐标. 需求: 1. 点击 btn1 打印 div1 相对于页面左上角的位置 打 ...

  10. docker 开启远程

    # vi /etc/init.d/docker   在start()中加入:$exec -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -d & ...