洛谷 P3924 康娜的线段树 解题报告
P3924 康娜的线段树
题目描述
小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她\(OI\)。
今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害的东西。康娜试着写了一棵维护区间和的线段树。由于她不会打标记,因此所有的区间加操作她都是暴力修改的。具体的代码如下:
struct Segment_Tree{
#define lson (o<<1)
#define rson (o<<1|1)int sumv[N<<2],minv[N<<2];inline void pushup(int o){sumv[o]=sumv[lson]+sumv[rson];}inline void build(int o,int l,int r){if(l==r){sumv[o]=a[l];return;}int mid=(l+r)>>1;build(lson,l,mid);build(rson,mid+1,r);pushup(o);}inline void change(int o,int l,int r,int q,int v){if(l==r){sumv[o]+=v;return;}int mid=(l+r)>>1;if(q<=mid)change(lson,l,mid,q,v);else change(rson,mid+1,r,q,v);pushup(o);}
}T;
在修改时,她会这么写:
for(int i=l;i<=r;i++)T.change(1,1,n,i,addv);
显然,这棵线段树每个节点有一个值,为该节点管辖区间的区间和。
康娜是个爱思考的孩子,于是她突然想到了一个问题:
如果每次在线段树区间加操作做完后,从根节点开始等概率的选择一个子节点进入,直到进入叶子结点为止,将一路经过的节点权值累加,最后能得到的期望值是多少?
康娜每次会给你一个值\(qwq\),保证你求出的概率乘上\(qwq\)是一个整数。
这个问题太简单了,以至于聪明的康娜一下子就秒了。
现在她想问问你,您会不会做这个题呢?
输入输出格式
输入格式:
第一行整数\(n,m,qwq\)表示线段树维护的原序列的长度,询问次数,分母。
第二行\(n\)个数,表示原序列。
接下来\(m\)行,每行三个数\(l,r,x\)表示对区间\([l,r]\)加上\(x\)
输出格式:
共\(m\)行,表示期望的权值和乘上\(qwq\)结果。
说明
对于30%的数据,保证 \(1 \leq n,m \leq 100\)
对于70%的数据,保证 \(1 \leq n,m, \leq 10^{5}\)
对于100%的数据,保证 \(1 \leq n,m \leq 10^6\)
\(-1000 \leq a_i,x \leq 1000\)
其实题目不难,然而我概率期望学的差,还是不怎么会做。
我们发现,其实每个叶子节点的贡献的不会变的,则第\(i\)个叶子节点贡献的次数是它之前的所有包含它的区间的贡献次数之和。
根据条件概率,每一个大区间出现的概率都是它的子区间的两倍,所以我们以最小的区间算做1,统计每个叶子节点的贡献次数,最后再除以\(\lceil logn \rceil\)即可。
具体实现可以直接模拟建树统计。
然后我们发现操作只有区间加和全局询问。
区间加我们可以通过叶子节点贡献次数前缀和维护全局偏移量。
复杂度:\(O(nlogn+m)\)
Code:
#include <cstdio>
#define ll long long
ll max(ll x,ll y){return x>y?x:y;}
const ll N=1000010;
ll dat[N],cnt[N],f[N],ans,QAQ,n,m,d,dep[N];
void build(ll l,ll r,ll Dep)
{if(l==r){dep[l]=Dep;d=max(d,Dep);return;}ll mid=l+r>>1;build(l,mid,Dep+1);build(mid+1,r,Dep+1);
}
void init()
{scanf("%lld%lld%lld",&n,&m,&QAQ);build(1,n,1);for(ll i=1;i<=n;i++){if(dep[i]==d)cnt[i]=(1<<d)-1;elsecnt[i]=(1<<d)-2;scanf("%lld",dat+i);f[i]=f[i-1]+cnt[i];ans+=cnt[i]*dat[i];}
}
void work()
{ll l,r,x;d=1<<d-1;for(ll i=1;i<=m;i++){scanf("%lld%lld%lld",&l,&r,&x);ans+=(f[r]-f[l-1])*x;printf("%lld\n",(QAQ/d*ans));}
}
int main()
{init();work();return 0;
}
2018.7.21
转载于:https://www.cnblogs.com/butterflydew/p/9347494.html
洛谷 P3924 康娜的线段树 解题报告相关推荐
- 洛谷 P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...
- P3924 康娜的线段树(マジやばくね)(线段树、期望、前缀和)难度⭐⭐⭐★
P3924 康娜的线段树 我觉得挺难的,マ(ma)ジ(ji)や(ya)ば(ba)く(ku)ね(ne)(不得了了)知道康娜的应该都懂 题解 P3924 [康娜的线段树] #include<iost ...
- P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...
- P3924 康娜的线段树(线段树+期望)
题目 题目传送门\color{red} 题目传送门题目传送门 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段 ...
- 洛谷 P3373 【模板】线段树 2 题解
洛谷 P3373 [模板]线段树 2 题解 题面 题目链接:[戳这里](https://www.luogu.org/problemnew/show/P3373) 题目描述 输入输出格式 输入输出样例 ...
- 洛谷9月月赛 康娜的线段树
题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常 ...
- 【题解】康娜的线段树
题目 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害 ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- 洛谷 P3372 【模板】线段树 1(线段树区间加区间找)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...
最新文章
- cat全链路监控_谛听全链路监控平台实践与思考
- jzoj3058-火炬手【高精度,暴力】
- 【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)
- 计算机应用基础1,计算机应用基础1
- 运用Axure6.5快速完成微信交互效果的简单办法
- 查看一个网站后台是用的什么服务器
- nux 平台的 libpcap 源代码分析
- linux终端 介绍,全面介绍Linux终端命令(二)
- 在Python中将十六进制字符串转换为int
- win11 P85主板能正常安装吗 windows11使用p85主板的安装的步骤方法
- 山东大学计算机专业毕业后,儿子被山东大学数学系录取,毕业之后的前景将会如何...
- 数学建模线性规划之Lingo教程
- vim打开bin文件
- 生物医学工程实用在线工具
- 老王的JAVA基础课:第1课 计算机基础知识
- 如何使用git上传项目至GitHub repository
- 数据挖掘是什么,数据挖掘的学习路线是什么?
- 对账 概念 - 账证核对,账账核对,账实核对,账表核对
- MySQL5.7.20安装
- sip转webrct