洛谷 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;
else
cnt[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
洛谷 P3924 康娜的线段树 解题报告的更多相关文章
- 洛谷 P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息, ...
- 洛谷P3924 康娜的线段树(期望 前缀和)
题意 题目链接 Sol 思路就是根据期望的线性性直接拿前缀和算贡献.. 这题输出的时候是不需要约分的qwq 如果你和我一样为了AC不追求效率的话直接#define int __int128就行了.. ...
- P3924 康娜的线段树(期望)
P3924 康娜的线段树 看起来$O(nlogn)$可过其实由于巨大常数是无法通过的 $O(nlogn)$:70pts 我们手玩样例发现 线段树上某个节点的期望值$f[o]=(f[lc]+f[rc]) ...
- P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...
- luogu P3924 康娜的线段树
题面传送门 我们可以画图找规律 这里没图,要看图可以去看M_sea dalao的题解(逃 可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(de ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
- 洛谷P1083 借教室 NOIP2012D2T2 线段树
正解:线段树 解题报告: ...真的不难啊只是开了这个坑就填下? 就是先读入每天的教室数建个线段树然后每次读入就update一下,线段树存的就这一段的最小值啊,然后如果有次更新完之后tr[1]小于0了 ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 洛谷P3372 【模板】线段树 1
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...
随机推荐
- 利用 Intel Realsense做SLAM开发(一)
最近手里拿到一台Realsense D435,就是这个: https://click.intel.com/intelr-realsensetm-depth-camera-d435.html 所以准备拿 ...
- 梯度下降算法以及其Python实现
一.梯度下降算法理论知识 我们给出一组房子面积,卧室数目以及对应房价数据,如何从数据中找到房价y与面积x1和卧室数目x2的关系? 为了实现监督学习,我们选择采用自变量x1.x2的线性函数来评估因变 ...
- Spring Bean注册解析(一)
Spring是通过IoC容器对Bean进行管理的,而Bean的初始化主要分为两个过程:Bean的注册和Bean实例化.Bean的注册主要是指Spring通过读取配置文件获取各个bean的 ...
- [leetcode-914-X of a Kind in a Deck of Cards]
In a deck of cards, each card has an integer written on it. Return true if and only if you can choos ...
- Js 问题分析--js 影响页面性能
文档下载链接:http://pan.baidu.com/s/1i4Hci4d (失效请留言)
- 结对作业_Two
Part 1.前言 (附:本次编码涵盖的所有功能均为java语言实现) 结对项目作业 结对同学高裕翔的博客 个人github传送门 博文pdf链接 Part 2.具体分工 本次的结对作业我们简单的拆分 ...
- 缓存-System.Web.Caching.Cache
实现 Web 应用程序的缓存. 每个应用程序域创建一个此类的实例,只要应用程序域将保持活动状态,保持有效. 有关此类的实例的信息,请通过Cache的属性HttpContext对象或Cache属性的Pa ...
- map的默认排序和自定义排序
STL的容器map为我们处理有序key-value形式数据提供了非常大的便利,由于内部红黑树结构的存储,查找的时间复杂度为O(log2N). 一般而言,使用map的时候直接采取map<typen ...
- spring重定向与转发
1.重定向 A,通过ModelAndView以及RedirectView @RequestMapping("/login1.do") public ModelAndView log ...
- css3 flex属性flex-grow、flex-shrink、flex-basis学习笔记
最近在研究css3的flex.遇到的flex:1;这一块,很是很纠结,flex-grow.flex-shrink.flex-basis始终搞不清,最经搜集了大量的介绍,应该能算是明白了.网上大部分解释 ...