Codeforces 895E Eyes Closed(线段树)
题目链接 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(线段树)的更多相关文章
- Buses and People CodeForces 160E 三维偏序+线段树
Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...
- CodeForces 877E DFS序+线段树
CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- [Codeforces 1199D]Welfare State(线段树)
[Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...
- [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)
[Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- Codeforces 482B Interesting Array(线段树)
题目链接:Codeforces 482B Interesting Array 题目大意:给定一个长度为N的数组,如今有M个限制,每一个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是 ...
- codeforces 383C Propagating tree 线段树
http://codeforces.com/problemset/problem/383/C 题目就是说, 给一棵树,将一个节点的值+val, 那么它的子节点都会-val, 子节点的子节点+val. ...
- CodeForces 228D. Zigzag(线段树暴力)
D. Zigzag time limit per test 3 seconds memory limit per test 256 megabytes input standard input out ...
随机推荐
- LeetCode之Weekly Contest 102
第一题:905. 按奇偶校验排序数组 问题: 给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入: ...
- CentOS 系统下Gitlab搭建与基本配置 以及代码备份迁移过程
GitLab 是一个开源的版本管理系统,提供了类似于 GitHub 的源代码浏览,管理缺陷和注释等功能,你可以将代码免费托管到 GitLab.com,而且不限项目数量和成员数.最吸引人的一点是,可以在 ...
- paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之fsm summary
主要是1.不要用1段式写FSM 2.不要用状态编码写one-hot FSM ,要用索引编码写one-hot FSM.
- python中文件操作的六种模式及对文件某一行进行修改的方法
一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...
- vss安装注意点
一:装好IIS 二:win7用管理员权限打开 server configuration 才能打上勾 三:用计算机名,不要用 Ip地址
- HDU 5239 Doom 线段树
题意: 有\(n(1 \leq n \leq 10^5)\)个数,和\(m(1 \leq m \leq 10^5)\)操作,和一个计算\(s\),一切运算都在模\(MOD\)进行的. 操作\(l, \ ...
- Android Studio安装踩坑
title: Android Studio安装踩坑 date: 2018-09-07 19:31:32 updated: tags: [Android,Android Studio,坑] descri ...
- cf963b Destruction of a Tree
越靠近叶子越优先删掉 #include <iostream> #include <vector> #include <cstdio> using namespace ...
- luogu3376 【模板】网络最大流 dinic
当前弧优化 #include <iostream> #include <cstring> #include <cstdio> #include <queue& ...
- C++ STL 的初步认知
学无止境!!! 尊重他人劳动,尊重出处:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 我已经做了4年的MFC ...