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

今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害的东西。康娜试着写了一棵维护区间和的线段树。由于她不会打标记,因此所有的区间加操作她都是暴力修改的。具体的代码如下:(略)
显然,这棵线段树每个节点有一个值,为该节点管辖区间的区间和。
康娜是个爱思考的孩子,于是她突然想到了一个问题:
如果每次在线段树区间加操作做完后,从根节点开始等概率的选择一个子节点进入,直到进入叶子结点为止,将一路经过的节点权值累加,最后能得到的期望值是多少?
康娜每次会给你一个值 qwq ,保证你求出的概率乘上 qwq 是一个整数。
这个问题太简单了,以至于聪明的康娜一下子就秒了。
现在她想问问你,您会不会做这个题呢?
\(n, m <= 10^{6}\)
Solution
单点将 叶子结点\(k\) 加上 \(x\) , 由于线段树的结构, 设此节点处于线段树第 \(dep[k]\) 层, 有答案加上:
\]
然后区间修改可以视为多次单点修改, 互相不构成影响, 令 \(a[i] = \frac{2^{n} - 1}{2^{n - 1}}\) , 固有 \(l, r\) 的修改总答案加上:
\]
可以以前缀和维护 \(a[i]\) , 故式子变为:
\]
可以在 \(O(1)\) 的时间内完成一次询问
现在只需要求解每个叶子节点的深度即可
处理数据的时候有可能在前缀和部分无法很好的解决精度问题, 为了简便运算, 令所有的 \(a[i] *= 2^{maxdep}\) , 这样每个 \(a[i]\) 就变成了
\]
在输出的时候统一再除以 \(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;
}
P3924 康娜的线段树的更多相关文章
- P3924 康娜的线段树(期望)
P3924 康娜的线段树 看起来$O(nlogn)$可过其实由于巨大常数是无法通过的 $O(nlogn)$:70pts 我们手玩样例发现 线段树上某个节点的期望值$f[o]=(f[lc]+f[rc]) ...
- 洛谷 P3924 康娜的线段树 解题报告
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她\(OI\). 今天康娜学习了一种叫做线段树的神奇魔法,这种 ...
- 洛谷 P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息, ...
- luogu P3924 康娜的线段树
题面传送门 我们可以画图找规律 这里没图,要看图可以去看M_sea dalao的题解(逃 可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(de ...
- 洛谷P3924 康娜的线段树(期望 前缀和)
题意 题目链接 Sol 思路就是根据期望的线性性直接拿前缀和算贡献.. 这题输出的时候是不需要约分的qwq 如果你和我一样为了AC不追求效率的话直接#define int __int128就行了.. ...
- Solution -「线段树」题目集合
T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...
- 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...
- $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基
正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...
- 「洛谷 P3834」「模板」可持久化线段树 题解报告
题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项 ...
随机推荐
- Thirteenth scrum meeting 2015/11/11
发布bug整理集结: 手机用户体验优化优化: (1)主界面和课程界面的字体规格以及界面结构不同 (2)课程图片的大小格式不统一,造成美观下降 ( 3 )按钮的位置不美观 平板用户体验: (1)Tab键 ...
- OO最后一次总结
测试与正确性论证 Dijkstra说过:“程序测试只能证明程序有错,不能证明程序正确.”所谓程序测试,实际上是测试者特意挑出一批检查数据,通过运行程序,检查每个输入数据所对应的运行结果是否符合预期要求 ...
- crontab任务不生效
新建php脚本ctTest.php,代码如下: <?php /****************************************************************** ...
- web153
电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...
- 索引超出了数组界限。 在 System.Collections.Generic.Dictionary`2.Resize
博问:Dictionary 超出了数组界限 异常: Exception type: IndexOutOfRangeException Exception message: 索引超出了数组界限. 在 S ...
- Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)
一 基础知识 字节 8位半字 16位字 32位 二 解惑 Code, RO-data,RW-data,ZI-data Code为程序代码部分RO-data 表示 程序定义的常量const t ...
- React---点击按钮实现内容复制功能
思路: 1.给要复制的内容容器添加一个标签(可以是ID,可以是类名等),通过dom技术获取该容器对象: 2.创建Range对象(某个区域内连续的内容),把该容器对象放进去: 3.将Range对象添加到 ...
- 简单 dp
1.摆花问题 题目描述小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过a ...
- [转帖] IIS 与 HTTP/2 的介绍.
HTTP/2 on IIS https://blogs.iis.net/davidso/http2 Friday, September 11, 2015 Windows 10 HTTP2 In Oct ...
- vue 笔记1
created 钩子可以用来在一个实例被创建之后执行代码: new Vue({ data: { a: 1 }, created: function () { // `this` 指向 vm 实例 co ...