P3924 康娜的线段树

题目描述
小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI。

今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害的东西。康娜试着写了一棵维护区间和的线段树。由于她不会打标记,因此所有的区间加操作她都是暴力修改的。具体的代码如下:(略)

显然,这棵线段树每个节点有一个值,为该节点管辖区间的区间和。

康娜是个爱思考的孩子,于是她突然想到了一个问题:

如果每次在线段树区间加操作做完后,从根节点开始等概率的选择一个子节点进入,直到进入叶子结点为止,将一路经过的节点权值累加,最后能得到的期望值是多少?

康娜每次会给你一个值 qwq ,保证你求出的概率乘上 qwq 是一个整数。

这个问题太简单了,以至于聪明的康娜一下子就秒了。

现在她想问问你,您会不会做这个题呢?

\(n, m <= 10^{6}\)

Solution

单点将 叶子结点\(k\) 加上 \(x\) , 由于线段树的结构, 设此节点处于线段树第 \(dep[k]\) 层, 有答案加上:
\[x * \sum_{i = 0}^{dep[k] - 1}{\frac{1}{2^{i}}}\]\[=x * \frac{2^{n} - 1}{2^{n - 1}}(n = dep[k])\]
然后区间修改可以视为多次单点修改, 互相不构成影响, 令 \(a[i] = \frac{2^{n} - 1}{2^{n - 1}}\) , 固有 \(l, r\) 的修改总答案加上:
\[x * \sum_{i = l}^{r}{a[i]}\]
可以以前缀和维护 \(a[i]\) , 故式子变为:
\[(sum[r] - sum[l - 1]) * x\]
可以在 \(O(1)\) 的时间内完成一次询问
现在只需要求解每个叶子节点的深度即可

处理数据的时候有可能在前缀和部分无法很好的解决精度问题, 为了简便运算, 令所有的 \(a[i] *= 2^{maxdep}\) , 这样每个 \(a[i]\) 就变成了
\[(2^{n} - 1) * (2^{maxdep - n + 1})\]
在输出的时候统一再除以 \(frac = 2^{maxdep}\) 即可
输出为:\[(sum[r] - sum[l - 1]) * x / frac * qwq\]

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(LL i = (x);i <= (y);i++)
using namespace std;
LL RD(){LL out = 0,flag = 1;char c = getchar();while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}return flag * out;}
const LL maxn = 2000019;
LL num, na, qwq;
LL v[maxn], dep[maxn], maxdep;
LL ans;
#define lid (id << 1)
#define rid (id << 1) | 1
struct seg_tree{LL l, r;LL sum;}tree[maxn << 2];
void build(LL id, LL l, LL r, LL d){tree[id].l = l, tree[id].r = r;if(l == r){tree[id].sum = v[l];dep[l] = d;maxdep = max(maxdep, d);return ;}LL mid = (l + r) >> 1;build(lid, l, mid, d + 1), build(rid, mid + 1, r, d + 1);tree[id].sum = tree[lid].sum + tree[rid].sum;}
void dfs(LL id, LL d){ans += tree[id].sum * (1 << (maxdep - d + 1));if(tree[id].l == tree[id].r)return ;dfs(lid, d + 1), dfs(rid, d + 1);}
LL gcd(LL a, LL b){return !b ? a : gcd(b, a % b);}
LL a[maxn], sum[maxn];
int main(){num = RD(), na = RD(), qwq = RD();REP(i, 1, num)v[i] = RD();build(1, 1, num, 1), dfs(1, 1);LL frac = 1 << maxdep;LL d = gcd(frac, qwq);frac /= d, qwq /= d;REP(i, 1, num){a[i] = ((1 << dep[i]) - 1) * (1 << (maxdep - dep[i] + 1));sum[i] = sum[i - 1] + a[i];}while(na--){LL l = RD(), r = RD(), x = RD();ans += (sum[r] - sum[l - 1]) * x;printf("%lld\n", ans / frac * qwq);}return 0;}

转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9751249.html

P3924 康娜的线段树相关推荐

  1. P3924 康娜的线段树(マジやばくね)(线段树、期望、前缀和)难度⭐⭐⭐★

    P3924 康娜的线段树 我觉得挺难的,マ(ma)ジ(ji)や(ya)ば(ba)く(ku)ね(ne)(不得了了)知道康娜的应该都懂 题解 P3924 [康娜的线段树] #include<iost ...

  2. 洛谷 P3924 康娜的线段树

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...

  3. 洛谷 P3924 康娜的线段树 解题报告

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她\(OI\). 今天康娜学习了一种叫做线段树的神奇魔法,这种 ...

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

    题目 题目传送门\color{red} 题目传送门题目传送门 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段 ...

  5. 【题解】康娜的线段树

    题目 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害 ...

  6. 洛谷9月月赛 康娜的线段树

    题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常 ...

  7. 【总结】线段树 进阶

    我竟然开了这么多坑...ε=(´ο`*)))唉,慢慢填吧... 线段树 进阶 前置芝士 然后我们来讲一个好玩的东西,叫权值线段树. 权值线段树&动态开点 有一个数列,数列里的每个不同的 aia ...

  8. nyoj 盖伦的告白(线段树||双端队列)

    盖伦的告白 题目描述 盖伦和赵信这对基友又在打赌,谁输了就去向卡特琳娜告白.. 这一季中盖伦一如既往的怂.赵信为了帮他一把,故意表现出很厉害的样子,结果成功激活了盖伦的智商. 赵信手中有n张牌,每张牌 ...

  9. NYOJ备用2344 盖伦的告白(线段树||双端队列)

    2344: 盖伦的告白 时间限制: 1 Sec   内存限制: 128 MB 提交: 56   解决: 19 [ 提交][ 状态][ 讨论版] 题目描述 盖伦和赵信这对基友又在打赌,谁输了就去向卡特琳 ...

最新文章

  1. 2022-2028年中国遇水膨胀橡胶行业市场研究及前瞻分析报告
  2. 设计模式 -- 策略模式
  3. Golang之轻松化解defer的温柔陷阱
  4. linux下使用automake、autoconf生成configure文件
  5. R语言编程艺术#01#数据类型向量(vector)
  6. .NETFramework-Web.Mvc:ViewResult
  7. Gartner:2021全球安全和风险支出将超1500亿美元
  8. C语言课后习题(47)
  9. echart 高度 不用 不撑满_你担心的高度近视老了之后是这样的
  10. 今天tiktok小社群更新 第5个项目行业案例
  11. 惠普企业警告:Sudo 漏洞可使攻击者获得 Aruba 平台的 root 权限
  12. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
  13. MySQL-多表操作
  14. 基于Jeecg的权限获取
  15. linux 下使用 tc 模拟网络延迟和丢包-使用 linux 模拟广域网延迟 - Emulating wide area network delays with Linux...
  16. linux 安装qt mysql库_Linux下QT平台Mysql数据库开发环境配置
  17. 全集然文明nbsp;(请点击图标进…
  18. jzoj 1006: 【入门】求商数和余数
  19. IE8下indexOf兼容方法
  20. 高中信息技术真题(2022下)

热门文章

  1. android中函数的直接使用用import就可以了吗各种类不用创建对象吗_React Hooks 如何安全地使用state...
  2. 360浏览器清除缓存_放飞浏览器的反应速度
  3. linux的文件与目录,linux-文件与目录
  4. mysql get global_getdata table表格数据join mysql方法
  5. Oracle监听注册和sqlnet,Oracle监听配置(四)--如何实现静态、动态注册
  6. python做接口测试的优点_python做接口测试的必要性
  7. matlab写的串口通信图像上位机,MATLAB的串口通信
  8. Anaconda不同平台的安装方式
  9. HDFS完全分布式集群搭建
  10. 第五章 卷积神经网络(CNN)