Desctiption

传送门:Portal

大致题意: 给你一个序列, 支持两种操作:

  1. 1 l1 r1 l2 y2 在\([l1, r1]\)随机选择一个数a, \([l2, r2]\) 内随机选择一个数b, 交换a, b.
  2. 2 l r 询问一个区间的期望.

\[n \leq 200000; a_i \leq 1e9
\]

Solution

根据期望线性性,只需要维护出每个位置元素值的期望就可以.

区间操作期望问题的经典套路是维护出每个位置的期望.

考虑一个数字\(a_i\)

他有\(\frac{len - 1}{len}\) 的概率保持原数, 否则,根据全期望公式, 它会变成\(E(b_i) = \sum\frac{b_i}{lenB}\)

那么有:

\[A_i = \frac{(lenA - 1)A_i + \sum \frac{b_i}{lenB}}{lenA}
\]

\(b_i\)也同理.

所以我们只需要维护一个区间加/乘, 区间求和的线段树就可以了.

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for(int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef long long LL;
typedef long double LD;
int read() {
char ch = getchar();
int x = 0, flag = 1;
for (;!isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
for (;isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * flag;
}
void write(int x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + 48);
} const int Maxn = 200009;
int a[Maxn]; namespace SGMTtree {
double tree[Maxn << 3], addTag[Maxn << 3], mulTag[Maxn << 3];
#define lc(x) ((x) << 1)
#define rc(x) (((x) << 1) | 1)
#define ls rt << 1, l, mid
#define rs (rt << 1) | 1, mid + 1, r
void setAdd(int root, int l, int r, double v) {
tree[root] += v * (r - l + 1.0); addTag[root] += v;
}
void setMul(int root, int l, int r, double v) {
tree[root] *= v;
mulTag[root] *= v; addTag[root] *= v;
}
void (*setTag)(int, int, int, double);
void set(int p) {
if(p == 1) setTag = setAdd;
if(p == 2) setTag = setMul;
} void pushdown(int rt, int l, int r) {
int mid = (l + r) >> 1;
if (mulTag[rt] != 1.0) {
setMul(ls, mulTag[rt]), setMul(rs, mulTag[rt]);
mulTag[rt] = 1;
}
if (addTag[rt] != 0.0) {
setAdd(ls, addTag[rt]); setAdd(rs, addTag[rt]);
addTag[rt] = 0;
}
}
void pushup(int rt) { tree[rt] = tree[lc(rt)] + tree[rc(rt)]; } void build(int rt, int l, int r) {
addTag[rt] = 0, mulTag[rt] = 1;
if (l == r) {
tree[rt] = a[l];
return ;
}
int mid = (l + r) >> 1;
build(ls), build(rs);
pushup(rt);
}
void modify(int rt, int l, int r, int p, int q, double v) {
if (p > q) return ;
if (p <= l && r <= q) {
setTag(rt, l, r, v);
return ;
}
int mid = (l + r) >> 1; pushdown(rt, l, r);
if (q <= mid) modify(ls, p, q, v);
else if (p > mid) modify(rs, p, q, v);
else modify(ls, p, q, v), modify(rs, p, q, v);
pushup(rt);
}
double query(int rt, int l, int r, int p, int q) {
if (p <= l && r <= q) return tree[rt];
int mid = (l + r) >> 1; pushdown(rt, l, r);
if (q <= mid) return query(ls, p, q);
else if (p > mid) return query(rs, p, q);
else return query(ls, p, q) + query(rs, p, q);
}
#undef lc
#undef rc
#undef ls
#undef rs
}; int n, q; void init() {
n = read(); q = read();
rep (i, 1, n) a[i] = read();
SGMTtree :: build(1, 1, n);
} void solve() {
rep (i, 1, q) {
int opt = read();
if (opt == 1) {
int l1 = read(), r1 = read(), l2 = read(), r2 = read();
double c = r1 - l1 + 1.0, d = r2 - l2 + 1.0, tmp1 = SGMTtree :: query(1, 1, n, l1, r1), tmp2 = SGMTtree :: query(1, 1, n, l2, r2);
SGMTtree :: set(2), SGMTtree :: modify(1, 1, n, l1, r1, c - 1.0);
SGMTtree :: set(2), SGMTtree :: modify(1, 1, n, l2, r2, d - 1.0);
SGMTtree :: set(1), SGMTtree :: modify(1, 1, n, l1, r1, tmp2 / d);
SGMTtree :: set(1), SGMTtree :: modify(1, 1, n, l2, r2, tmp1 / c);
SGMTtree :: set(2), SGMTtree :: modify(1, 1, n, l1, r1, 1 / c);
SGMTtree :: set(2), SGMTtree :: modify(1, 1, n, l2, r2, 1 / d);
}
if (opt == 2) {
int l = read(), r = read();
printf("%.7lf\n", SGMTtree :: query(1, 1, n, l, r));
}
}
} int main() {
// freopen("CF895E.in", "r", stdin);
// freopen("CF895E.out", "w", stdout); init();
solve(); #ifdef Qrsikno
debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
return 0;
}

调试:

线段树函数指针必须要用namespace.

[CF895E] Eyes Closed(线段树,期望)的更多相关文章

  1. CF895 E. Eyes Closed(线段树 期望)

    题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...

  2. BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit] ...

  3. JZYZOJ1527 [haoi2012]高速公路 线段树 期望

    http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...

  4. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  5. BZOJ 4262 线段树+期望

    思路: 把询问离线下来,查询max和查询min相似,现在只考虑查询max 令sum[l,r,x]表示l到r内的数为左端点,x为右端点的区间询问的答案 那么询问就是sun[l1,r1,r2]-sum[l ...

  6. 洛谷P3924 康娜的线段树(期望 前缀和)

    题意 题目链接 Sol 思路就是根据期望的线性性直接拿前缀和算贡献.. 这题输出的时候是不需要约分的qwq 如果你和我一样为了AC不追求效率的话直接#define int __int128就行了.. ...

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

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

  8. P3924 康娜的线段树(期望)

    P3924 康娜的线段树 看起来$O(nlogn)$可过其实由于巨大常数是无法通过的 $O(nlogn)$:70pts 我们手玩样例发现 线段树上某个节点的期望值$f[o]=(f[lc]+f[rc]) ...

  9. hdu-5805 NanoApe Loves Sequence(线段树+概率期望)

    题目链接: NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 262144/131072 ...

随机推荐

  1. 1571. [Usaco2009 Open]滑雪课Ski

    传送门 可以想到 $dp$,设 $f[i][j]$ 表示当前等级为 $i$,时间为 $j$ 的最大滑雪次数 显然上课不会上让自己等级降低的课,所以第一维 $i$ 满足无后效性 然后直接枚举 $i,j$ ...

  2. Javascript 数组的一些操作

    (1) shift  删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4, ...

  3. 参数化解决sql注入

    用DynamicParameters: string where = " where a.is_deleted=0 and a.bvent_id=@bventId and au.user_t ...

  4. JavaScript中的map()函数

    概述Array.map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值,同时不会改变原来的数组. 用法 Array.map(callback); 示例 //简单数组 const ...

  5. Sass--传一个不带值的参数

    Sass 的混合宏有一个强大的功能,可以传参,那么在 Sass 中传参主要有以下几种情形: A) 传一个不带值的参数 在混合宏中,可以传一个不带任何值的参数,比如: @mixin border-rad ...

  6. java String练习题

    package java07; /* 题目: 定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串,格式参照如下:[word1#word2#word3] 思路: 1.首先准备一个int[]数 ...

  7. 机器学习:1.K近邻算法

    1.简单案例:预测男女,根据身高,体重,鞋码 import numpy as np import matplotlib import sklearn from skleran.neighbors im ...

  8. 运行rabbitmq

    docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq c4663bdca2cd

  9. 【FTP】FTP(文件传输协议)工作原理(SFTP)

    目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...

  10. VM安装OSX进度条一半时卡住不动,【附】OSX10.10 ISO镜像文件

    安装OSX10.10真是一波多折,先是下载了一个5G多的原版dmg文件,转成ISO后在虚拟机上无法识别,后按网上的说的方法​​​​在提取出来的BaseSystem.dmg文件,再转成ISO文件,​可以 ...