luogu P3924 康娜的线段树
我们可以画图找规律
这里没图,要看图可以去看M_sea dalao的题解(逃
可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(dep_i\)为从上往下\(i\)节点所在的层数-1,也就是深度,令根节点的\(dep=0\))
我们可以发现,所有叶子节点的深度都是最大深度(记为\(ma\))或者最大深度-1,所以除开最下面一层,从上往下第\(i\)层的贡献都是序列中所有数之和\(*\frac{1}{2^{i-1}}\),最下面一层的每个叶子节点的贡献就是点权\(*\frac{1}{2^{ma}}\).为了方便,下面算答案时把所有数\(*2^{ma}\),输出的时候再除掉
我们先预处理最初的答案,记\(b=\sum_{j=1}^{ma}2^j\),序列中第\(i\)个数的贡献为\(a_i*(b+[dep_{i\text{在线段树中对应的叶子节点}}=ma])\)(如果是最后一层就多加上\(a_i\)是吧) 这里字不太好看先憋着
每次的区间加法,记\(c=\)区间内深度为\(ma\)的叶子节点个数,可以发现答案加上了\(x*(r-l+1)*b+x*c\)
最后答案要\(/2^{ma}*qwq\),并且注意将\(2^{ma}\)和\(qwq\)约分,不然会爆\(long\ long\)
我做题时居然那啥到强行用树状数组求前缀和qwq
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=1000000+10;
il LL rd()
{
re LL x=0,w=1;re char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
#define lc (o<<1)
#define rc ((o<<1)|1)
#define mid ((l+r)>>1)
int n,m,a[N],mm;
LL qwq,b=1,ans,c[N];
void init(int k,int l,int r)
{
if(l==r){mm=max(mm,a[l]=k);return;}
init(k+1,l,mid),init(k+1,mid+1,r);
}
il LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
int main()
{
n=rd(),m=rd(),qwq=rd();
init(0,1,n);
b=(1ll<<(mm+1))-2; //这就是题解中的b
for(re int i=1;i<=n;i++)
{
LL x=rd();
ans+=x*b;
c[i]+=c[i-1];
if(a[i]==mm) ++c[i],ans+=x;
}
mm=1ll<<mm;
LL gg=gcd(mm,qwq);mm/=gg,qwq/=gg;
for(re int i=1;i<=m;i++)
{
int l=rd(),r=rd();
LL x=rd();
ans+=1ll*(r-l+1)*x*b+(c[r]-c[l-1])*x;
printf("%lld\n",ans/mm*qwq);
}
return 0;
}
luogu P3924 康娜的线段树的更多相关文章
- P3924 康娜的线段树(期望)
P3924 康娜的线段树 看起来$O(nlogn)$可过其实由于巨大常数是无法通过的 $O(nlogn)$:70pts 我们手玩样例发现 线段树上某个节点的期望值$f[o]=(f[lc]+f[rc]) ...
- P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...
- 洛谷 P3924 康娜的线段树 解题报告
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她\(OI\). 今天康娜学习了一种叫做线段树的神奇魔法,这种 ...
- 洛谷 P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息, ...
- 洛谷P3924 康娜的线段树(期望 前缀和)
题意 题目链接 Sol 思路就是根据期望的线性性直接拿前缀和算贡献.. 这题输出的时候是不需要约分的qwq 如果你和我一样为了AC不追求效率的话直接#define int __int128就行了.. ...
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- 【原创】洛谷 LUOGU P3373 【模板】线段树2
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第 ...
- 【原创】洛谷 LUOGU P3372 【模板】线段树1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...
随机推荐
- C# 8小特性
对于C# 8,有吸引了大多数注意力的重大特性,如默认接口方法和可空引用,也有许多小特性被考虑在内.本文将介绍几例可能加入C#未来版本的小特性. 新的赋值运算符:&&=和||= 从第一个 ...
- Bootstrap缩略图
前面的话 缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底部(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件,本文将详细介绍Bootstr ...
- 牛客网练习赛7-D-无向图(bfs,链式前向星)
题意:中文题: 思路:就是找某个点距离其他点的距离,他给你很多点也无所谓.用一个dist[]数组,这个数组保存的是他给你的点到其他点的最短距离且标记的作用,然后bfs搜索就行了. 代码: #inclu ...
- MyBatis学习(七)MyBatis关联映射之多对多映射
对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...
- 自学Zabbix4.3 zabbix实战监控Web网站性能
自学Zabbix4.3 zabbix实战监控Web网站性能 用zabbix如何监控web性能和可用性呢?一般分为四个步骤:打开网站.登陆.登陆验证.退出,看实例. 1. 检测流程 1. 打开网站:如果 ...
- 自学Zabbix之路15.3 Zabbix数据库表结构简单解析-Triggers表、Applications表、 Mapplings表
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.3 Zabbix数据库表结构简单解析-Triggers表.Applica ...
- ORMLite学习入门笔记
ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...
- 分享一个自己做的SpringMVC的PPT
分享一个自己做的SpringMVC的PPT,由于比较忙只写了一些重要的部分
- Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!
今天遇到一个郁闷的事儿: 在一个JFrame上放了一个JList元件,这个JList元件添加了鼠标事件: mouseReleased.mousePressed ... 其中,在mouseRelease ...
- BRIEF特征简介
引言 该文是由EPFL的Calonder在ECCV2010上提出了一种可以快速计算且表达方式为二进制编码的描述子.主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串 ...