\(\\\)

\(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;
}

[ Luogu 3924 ] 康纳的线段树的更多相关文章

  1. NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树

    题目传送门 传送点I 传送点II 题目大意 (此题目不需要大意,我认为它已经很简洁了) 显然线段树合并(我也不知道哪来这么多显然) 考虑将每条路径拆成两条路径 s -> lca 和 t -> ...

  2. [Luogu P4215] 踩气球 (线段树)

    题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...

  3. luogu P4198 楼房重建——线段树

    题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...

  4. Luogu 3369 我用线段树骗了一道平衡树题……

    这篇博客毫无意义-- 只是表达一下我仍然会写树状数组和线段树-- 题目链接 #include <cstdio> #include <cstring> #include < ...

  5. [Luogu P4198]楼房重建(线段树)

    题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...

  6. luogu P3765 总统选举(线段树维护摩尔投票+平衡树)

    这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] ...

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

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

  8. Luogu P3459 [POI2007]MEG-Megalopolis(线段树)

    P3459 [POI2007]MEG-Megalopolis 题意 题目描述 Byteotia has been eventually touched by globalisation, and so ...

  9. Luogu P1712 [NOI2016]区间(线段树)

    P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...

随机推荐

  1. 洛谷 P1318 积水面积

    P1318 积水面积 题目描述 一组正整数,分别表示由正方体迭起的柱子的高度.若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000).找出所有可能积水的地方(图中蓝色部 ...

  2. substring详细用法,截取不行就用替换

    SUBSTRING 返回字符.binary.text      或      image      表达式的一部分.有关可与该函数一起使用的有效      Microsoft®      SQL    ...

  3. linux network name space

    linux network namespace概念类似于网络中的 VRF (virtual routing and forwarding).但是,你不知道VRF的概念也没关系,下面我们通过一个简单的介 ...

  4. Swift可选类型(Optional)之星耀

    首先我们先看下Objective-C与Swift语言对于可选nil的不同理解: Objective-C中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体.枚举等类型不起作用(会返回N ...

  5. SAS编程基础 - 数据获取与数据集操作(1)

    1. 数据来源 SAS数据来源主要有两种:一是通过input语句创建,另外一种方式是通过外部数据文件获取. 1.1 libname 1.2 odbc 1.3 passthrough 1.4 impor ...

  6. yarn-cli 缓存

    yarn cache list Yarn 会在你的用户目录下开辟一块全局缓存用以保存下载的包.yarn cache list 用于列出所有已经缓存的包. yarn cache dir 执行 yarn ...

  7. spoj 1812 LCS2 - Longest Common Substring II (后缀自己主动机)

    spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串. 限制: 1 < ...

  8. 中文man

    1.下载中文包:cd /usr/local/src wget http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpageszh-1. ...

  9. 在vs2017中创建Node.js项目

    https://github.com/Microsoft/nodejstools/wiki/Projects 1. 安装vs2017的时候,需要勾选Node.js 2.新建项目的时候,选择其他语言,然 ...

  10. 使用Zabbix监控ZooKeeper服务的健康状态

    一 应用场景描述 在目前公司的业务中,没有太多使用ZooKeeper作为协同服务的场景.但是我们将使用Codis作为Redis的集群部署方案,Codis依赖ZooKeeper来存储配置信息.所以做好Z ...