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. 3.Airflow使用

    1. airflow简介2. 相关概念2.1 服务进程2.1.1. web server2.1.2. scheduler2.1.3. worker2.1.4. celery flower2.2 相关概 ...

  2. preg_replace 以及弃用的e

    preg_replace (PHP 4, PHP 5) preg_replace — 执行一个正则表达式的搜索和替换 说明¶ mixed preg_replace ( mixed $pattern , ...

  3. win10与linux双系统切换时间不一致的调整

    按照Linux系统之后再切换回到win10后,我发现win10的时间不再是北京时间,而是比北京时间多了整整8小时,之后百度找到了问题来源,这里给出解决方法. 如果安装了 Windows 和 Linux ...

  4. 欢迎来怼—第二次Scrum会议

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片 二.开会信息 时间:2017/10/14 18:30~18:47,总计17min.地点:东北师范 ...

  5. 今目标登录时报网络错误E110

    今目标登录的时候报错了,错误代码:E110不论怎么修改都修复不了,百度相关资料也没有,只能联系客服. 经过好久终于联系上了客服,客服给出的解决方案是修改:Enternet选项: 第一步:打开,控制面板 ...

  6. 使用RStudio学习一个简单神经网络

    数据准备 1.收集数据 UC Irvine Machine Learning Repository-Concrete Compressive Strength Data Set 把下载到的Concre ...

  7. Alpha阶段敏捷冲刺 DAY5

    一.举行站立式例会 1.今天我们利用晚上的时间开展了站立会议,总结了一下之前工作的问题,并且制定了明天的计划. 2.站立式会议照片 二.团队报告 1.昨日已完成的工作 (1)改进了程序算法 (2)优化 ...

  8. 《高性能JavaScript》学习笔记(2)——日更中

    我说日更就日更,接着....今天从缓冲布局信息开始啦! -------------------2016-7-22 21:09:12------------------------------- 14. ...

  9. Ubuntu 16.04 LTS安装sogou输入法详解

    http://blog.csdn.net/qq_21792169/article/details/53152700 最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的 ...

  10. C语言为运算及 两个变量的赋值问题

    #include <stdio.h>#define ARRAY_SIZE 10int main() {    int arr[ARRAY_SIZE] = {51,116,53,120,85 ...