\(\\\)

\(Description\)


现在有一个线段树维护长为\(N\)的数列,实现方式是\(mid=((l+r)>>1)\),支持区间加,节点维护区间和。

共有\(M\)次区间加,每次区间加之后询问,选一条从根到任意叶子节点的链,其上的节点维护的区间和之和的期望。

  • \(N,M\le 10^6\)

\(\\\)

\(Solution\)


根据期望的线性性,开始的想法是维护每一个节点在选中的链上的概率,每次修改把修改乘上概率,复杂度\(\text O(NlogN)\),卡\(T\)三个点。

然后仔细回想每一次增加的过程。对一个叶子增加,显然对他的所有祖先都会有贡献,假如一个节点深度为\(k\),那么它被选在链里的概率就是\(\frac 1{2^k}\) ,所以一个叶子节点 \(i\) 从自己开始所有祖先的概率和为
\[ \sum_{i=0}^{deep[i]} \frac 1{2^i}=2-\frac 1{2^i} \]
因为期望的线性性,所以这一个叶节点增加,所有祖先会对总期望加上选择概率\(\times\)增量的答案,不妨直接记录每个叶节点及其祖先节点在这个节点增加时的概率和,这样就可以直接统计一个节点对答案的增量了。

然后区间加的时候区间的增量都相同,所以把概率求一个前缀和,然后总增量就是区间概率和\(\times\)单点增量了。

这题邪在需要\(long\ double\),而且用 \(printf\) 输出 \(\%lf\) 是非常慢的,所以要先强转\(long\ long\),然后注意转换的时候要设\(eps\)。

\(\\\)

\(Code\)


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1000010
#define R register
#define gc getchar
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
typedef long double ld;inline ll rd(){ll x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}ll n,m;
ld ans,bin[30],p[N];const ld eps=1e-9;void dfs(ll dp,ll l,ll r){if(l==r){p[l]=dp;return;}dfs(dp+1,l,mid);dfs(dp+1,mid+1,r);
}int main(){n=rd(); m=rd(); bin[0]=rd();dfs(0,1,n);for(R ll i=1;i<=30;++i) bin[i]=bin[i-1]/2;for(R ll i=1;i<=n;++i){p[i]=(bin[0]*2)-bin[(ll)p[i]];ans+=(ld)rd()*p[i]; p[i]+=p[i-1];}for(R ll i=1,l,r,w;i<=m;++i){l=rd(); r=rd(); w=rd();ans+=(ld)w*p[r]-(ld)w*p[l-1];printf("%lld\n",(ll)floor(ans+eps));}return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9780712.html

[ Luogu 3924 ] 康纳的线段树相关推荐

  1. Luogu P1198 [JSOI2008]最大数 线段树

    P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...

  2. LUOGU P4088 [USACO18FEB]Slingshot(线段树)

    传送门 解题思路 推了推式子发现是个二维数点,想了想似乎排序加线段树难写,就写了个树套树,结果写完看见空间才\(128M\)..各种奇技淫巧卡空间还是\(MLE\)到天上.后来只好乖乖的写排序+线段树 ...

  3. 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题

    题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...

  4. [BZOJ3211] 花神游历各国 - 线段树

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 4766  Solved: 1741 [Submit][Status][Dis ...

  5. [BZOJ5286][HNOI2018]转盘(线段树)

    https://www.luogu.org/problemnew/show/P4425 这题暴力40..HNOI2018两天暴力加起来有310+.. 首先有个大家都说显然我不会的结论,肯定有种最优策略 ...

  6. luogu P5142 区间方差(线段树、乘法逆元)

    luogu P5142 区间方差 本题要求维护模区间方差,很明显是一道数据结构题. 我们化简方差公式: 而平均数等于 可以发现,我们只需要维护序列的区间和和区间平方和,就可以维护平均数和方差. 区间和 ...

  7. luogu P4085 [USACO17DEC]Haybale Feast(尺取法 + 线段树)

    C.luogu P4085 [USACO17DEC]Haybale Feast 题目链接 直接开一个线段树维护即可. 注意开ll 线段树维护最大值.注意下标别写错了,比如tr[r] #include& ...

  8. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...

  9. UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)

    NOI2019考前做NOI2018题.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=5417 (luogu) http ...

最新文章

  1. Cortex-M0 LPC11U 中断向量
  2. 机器学习视频第二章2
  3. [HDOJ4006]The kth great number
  4. 四.Android adb命令(持续更新...)
  5. mybatisplus逻辑删除
  6. 70. Leetcode 701. 二叉搜索树中的插入操作 (二叉搜索树-基本操作类)
  7. Java Review - 并发编程_独占锁ReentrantLock原理源码剖析
  8. 浅谈常见的七种加密算法及实现(附代码)
  9. php thread linux,Linux_linux内核函数kernel_thread,设备驱动程序中,如果需要几 - phpStudy...
  10. 数据库“裸奔”再引祸端:VOIPO数百万呼叫和短信日志流出
  11. 快来看,大数据两地三中心的容灾也可以如此省心!
  12. 基于JAVA+Servlet+JSP+MYSQL的客户充值缴费管理系统
  13. DB2常用错误代码大全
  14. 20145202马超《java》实验5
  15. 限制mysql资源使用率_MySQL--限制用户使用资源
  16. SosoApi,编辑Swagger UI的神器
  17. jetson nano 人体姿态识别
  18. python 获取macd数据_60分钟MACD数据如何获取
  19. 美国德保罗大学计算机排名,2018福布斯美国最佳大学排名德保罗大学排名第243...
  20. 由于受到新冠疫情的影响,GDP同比增长率从2019年的6.1%下滑到了2.3%

热门文章

  1. linux下的module_param()解释【转】
  2. Poj 2887-Big String Splay
  3. 菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty
  4. eclipse常用插件安装
  5. 网站制作时应该如何更合理定位与策划
  6. String 类中怎么出现此类问题?
  7. conda 基本操作
  8. MySQL远程连接失败,MySQL远程连接出现Using password:YES错误的解决办法
  9. 实现盒子动画和键盘特效
  10. 【设计模式1】宏观总结