题目链接  Eyes Closed

题意  两个人玩一个游戏,现在有两种操作:

1、两个人格子挑选一个区间,保证两个的区间不相交。在这两个区间里面各选出一个数,交换这两个数。

2、挑选一个区间,求这个区间的和的期望。

对于第一种操作,先求出两个区间的长度$len1$和$len2$,再求出两个区间的期望和$s1$和$s2$。

对于第一个区间,我们先把这个区间里的所有数(期望值)乘上$(len1 - 1)/(len1)$,再加上$s2/len1/len2$

对于第二个区间,我们先把这个区间里的所有数(期望值)乘上$(len2 - 1)/(len2)$,再加上$s1/len1/len2$

线段树维护这两个操作即可。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define ls (i << 1)
#define rs (i << 1 | 1)
#define mid ((L + R) >> 1)
#define lson i << 1, L, mid
#define rson i << 1 | 1, mid + 1, R typedef long long LL; const int N = 4e5 + 10; double add[N], mul[N], s[N];
int n, q; void pushup(int i){ s[i] = s[ls] + s[rs]; } void pushdown(int i, int L, int R){
s[ls] = mul[i] * s[ls] + add[i] * (mid - L + 1);
mul[ls] *= mul[i];
add[ls] = mul[i] * add[ls] + add[i];
s[rs] = mul[i] * s[rs] + add[i] * (R - mid);
mul[rs] *= mul[i];
add[rs] = mul[i] * add[rs] + add[i];
add[i] = 0;
mul[i] = 1.0;
} void build(int i, int L, int R){
add[i] = 0, mul[i] = 1;
s[i] = 0;
if (L == R){ scanf("%lf", s + i); return; }
build(lson);
build(rson);
pushup(i);
} void add_update(int i, int L, int R, int l, int r, double val){
if (l <= L && R <= r){
s[i] += (R - L + 1) * val;
add[i] += val;
return;
} pushdown(i, L, R);
if (l <= mid) add_update(lson, l, r, val);
if (r > mid) add_update(rson, l, r, val);
pushup(i);
} void mul_update(int i, int L, int R, int l, int r, double val){
if (l <= L && R <= r){
s[i] *= val;
mul[i] *= val;
add[i] *= val;
return;
} pushdown(i, L, R);
if (l <= mid) mul_update(lson, l, r, val);
if (r > mid) mul_update(rson, l, r, val);
pushup(i);
} double query(int i, int L, int R, int l, int r){
if (l <= L && R <= r) return s[i];
double ret = 0;
pushdown(i, L, R);
if (l <= mid) ret += query(lson, l, r);
if (r > mid) ret += query(rson, l, r);
pushup(i);
return ret;
} int main(){ scanf("%d%d", &n, &q);
build(1, 1, n); while (q--){
int op;
scanf("%d", &op);
if (op == 1){
int l1, r1, l2, r2;
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
double s1 = query(1, 1, n, l1, r1);
double s2 = query(1, 1, n, l2, r2);
double len1 = r1 - l1 + 1;
double len2 = r2 - l2 + 1;
mul_update(1, 1, n, l1, r1, 1.0 * (len1 - 1) / len1);
mul_update(1, 1, n, l2, r2, 1.0 * (len2 - 1) / len2);
add_update(1, 1, n, l1, r1, 1.0 / len1 / len2 * s2);
add_update(1, 1, n, l2, r2, 1.0 / len1 / len2 * s1);
} else{
int l, r;
scanf("%d%d", &l, &r);
printf("%.12f\n", query(1, 1, n, l, r));
}
} return 0;
}

Codeforces 895E Eyes Closed(线段树)的更多相关文章

  1. Buses and People CodeForces 160E 三维偏序+线段树

    Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...

  2. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  3. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  4. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  5. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

  6. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  7. Codeforces 482B Interesting Array(线段树)

    题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...

  8. codeforces 383C Propagating tree 线段树

    http://codeforces.com/problemset/problem/383/C 题目就是说,  给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...

  9. CodeForces 228D. Zigzag(线段树暴力)

    D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...

随机推荐

  1. tomcat报错:java.io.IOException: 您的主机中的软件中止了一个已建立的连接。

    tomcat报错: org.apache.catalina.connector.ClientAbortException: java.io.IOException: 您的主机中的软件中止了一个已建立的 ...

  2. destoon 数据库操作

    1.插入数据 $db->query("INSERT INTO ".get_table($mid)." ($sqlk) VALUES ($sqlv)");  ...

  3. DeepFaceLab小白入门(5):训练换脸模型!

    训练模型,是换脸过程中最重要的一部分,也是耗时最长的一部分.很多人会问到底需要多少时间?有人会告诉你看loss值到0.02以下就可以了.我会告诉你,不要看什么数值,看预览窗口的人脸.看第二列是否和第一 ...

  4. 进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图

    进入JVM的世界:<深入理解JVM虚拟机>-- 思维导图 之前一直都是零零散散的看了些JVM的知识,心想这样不行啊!于是便抽空看了一下这本神书,阅罢,醍醐灌顶.豁然开朗.真正的是知其然,更 ...

  5. CUB reduce errorinvalid configuration argument

    解决CUB reduce errorinvalid configuration argument问题 在写TensorFlow代码时遇到报错 CUB reduce errorinvalid confi ...

  6. asm-offset.h 生成

    转自:https://blog.csdn.net/linglongqiongge/article/details/50008301 http://www.cnblogs.com/wendellyi/p ...

  7. CF 510b Fox And Two Dots

    Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...

  8. HBase0.94.2-cdh4.2.0需求评估测试报告1.0之二

    Hbase 配置文件: hbase-site.xml <configuration> <property> <name>hbase.cluster.distribu ...

  9. Numpy+Pandas读取数据

    1.为什么使用Numpy+Pandas 在使用Numpy读取csv文件时,文件中含有字符串时,会出现ValueError错误 2.Pandas读取csv文件:

  10. 控制台窗口和powershell运行服务会卡住的解决办法

    之前使用nodejs做了一个简单的web服务,通过控制台窗口运行,通过浏览器访问发现有时候浏览器等很久数据都加载不出来,以为是代码有问题,后来发现是控制台卡住了,按一下enter键就好了,当时百度了一 ...