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

P3924 康娜的线段树的更多相关文章

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

    P3924 康娜的线段树 看起来$O(nlogn)$可过其实由于巨大常数是无法通过的 $O(nlogn)$:70pts 我们手玩样例发现 线段树上某个节点的期望值$f[o]=(f[lc]+f[rc]) ...

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

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

  3. 洛谷 P3924 康娜的线段树

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

  4. luogu P3924 康娜的线段树

    题面传送门 我们可以画图找规律 这里没图,要看图可以去看M_sea dalao的题解(逃 可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(de ...

  5. 洛谷P3924 康娜的线段树(期望 前缀和)

    题意 题目链接 Sol 思路就是根据期望的线性性直接拿前缀和算贡献.. 这题输出的时候是不需要约分的qwq 如果你和我一样为了AC不追求效率的话直接#define int __int128就行了.. ...

  6. Solution -「线段树」题目集合

    T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...

  7. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

    正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...

  8. $CF938G\ Shortest\ Path\ Queries$ 线段树分治+线性基

    正解:线段树分治+线性基 解题报告: 传送门$QwQ$ 考虑如果只有操作3,就这题嘛$QwQ$ 欧克然后现在考虑加上了操作一操作二 于是就线段树分治鸭 首先线段树叶子节点是询问嘛这个不用说$QwQ$. ...

  9. 「洛谷 P3834」「模板」可持久化线段树 题解报告

    题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项 ...

随机推荐

  1. Final发布用户使用报告 -- Thunder团队

    Thunder爱阅app Final发布用户使用报告 用户数量:14人 以下为用户评论:(注:为了保护用户的姓名权,以下用户名以昵称形式给出.) 序列 昵称 个人信息 获得软件途径 使用次数 用户评论 ...

  2. Maven3 用Maven创建第一个web项目(2)servlet演示

    上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...

  3. js 刷新当前页面会弹出提示框怎样将这个提示框去掉

    //禁止刷新提示window.onbeforeunload = function() { var n = window.event.screenX - window.screenLeft; var b ...

  4. Centos7 django+uwsgi+nginx+python3.6.8部署

    安装依赖 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-d ...

  5. 【百度】大型网站的HTTPS实践(三)——HTTPS对性能的影响

    HTTPS在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS也会降低用户访问速度,增加网站服务器的计算资源消耗.本文主要介绍HTTPS对性能的影响. HTTPS对访问速度的影 ...

  6. spring 中 ThreadPoolTaskExecutor 的使用

    配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  7. 对synchronized的一点理解

    一.synchronized的使用(一).synchronized同步方法1. “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题.2. 如果多个线程共同访问 ...

  8. CentOS 7 上安装(LAMP)服务 Linux,Apache,MySQL,PHP

    介绍 LAMP 是现在非常流行的 WEB 环境, 是 Linux,Apache,MySQL,PHP 的缩写.数据存储在 MySQL 中,动态内容由 PHP 处理. 在本指南中,我们将演示如何在 Cen ...

  9. P4611 [COCI2011-2012#7] TRAMPOLIN

    题目背景 有很多超级英雄:蝙蝠侠,蜘蛛侠,超人等.其中,有一位叫牛.今天他想模仿蜘蛛侠,所以他选择了一排高大的摩天楼来跳. 题目描述 具体而言,他选择了一个由 N 个摩天大楼构成的序 列,从左到右编号 ...

  10. SpringBoot之mongoTemplate的使用

    springboot的版本1.5.17.RELEASE. 1.mongo的IP和端口 在resources下的application.properties中加入如下内容 spring.data.mon ...