题面传送门

我们可以画图找规律

这里没图,要看图可以去看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 康娜的线段树的更多相关文章

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

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

  2. P3924 康娜的线段树

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

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

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

  4. 洛谷 P3924 康娜的线段树

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

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

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

  6. luogu P2574 XOR的艺术 (线段树)

    luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...

  7. 【原创】洛谷 LUOGU P3373 【模板】线段树2

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第 ...

  8. 【原创】洛谷 LUOGU P3372 【模板】线段树1

    P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...

  9. Luogu P1198 BZOJ 1012 最大数 (线段树)

    手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...

随机推荐

  1. 51nod-1459-迷宫游戏

    题意:中文题目.. 解题思路:我的做法就是单源最短路中加个记录分数的数组,如果dis[i]到dis[x]的距离可以被优化,那就连记录分数的数组一起优化,如果第二条路和第一条路的距离相等,那就取最大的分 ...

  2. BZOJ3152[Ctsc2013]组合子逻辑——堆+贪心

    题目链接: BZOJ3152 题目大意: 一开始有一个括号包含[1,n],你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数要<=这个括号左端点那个数的大小,当一个括号包含另一个括号 ...

  3. BZOJ3676 APIO2014回文串(manacher+后缀自动机)

    由于本质不同的回文子串数量是O(n)的,考虑在对于每个回文子串在第一次找到它时对其暴力统计.可以发现manacher时若右端点移动则找到了一个新回文串.注意这样会漏掉串长为1的情况,特判一下. 现在问 ...

  4. SQL语言分类DQL,DML,DDL,DCL,DTL

    SQL语言共分为五大类: 数据查询语言DQL 数据操纵语言DML 数据定义语言DDL 数据控制语言DCL 数据事物语言DTL DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WH ...

  5. spoj COT - Count on a tree (树上第K小 LCA+主席树)

    链接: https://www.spoj.com/problems/COT/en/ 思路: 首先看到求两点之前的第k小很容易想到用主席树去写,但是主席树处理的是线性结构,而这道题要求的是树形结构,我们 ...

  6. MT【13】三角函数求范围

    解答:AB显然正确,C中$a$取0时,解为三个,C 错误.我们主要看一下D 评:这里提供了一个处理$sin^2xcosx$的常见方法:平方,单变量后用算术几何不等式.

  7. KEIL中函数定义存在但go to definition却不跳转的原因

    可能是 go to definition 函数的地方,被包含在一个未使能的条件编译宏内部,因为这样KEIL在编译时,就未将该条件编译宏内部的信息编译入工程的Browse Information.

  8. PKUWC 2019 记

     “连剑都插在了地上,可是我不应该就这么承认失败,想要到达山顶的人,不应该在山脚下就倒下啊” Day -5 (2019.1.15) 学考结束了,文化课暂停一段.早上飞机前往中山纪念中学.纪中好大呀,果 ...

  9. 关于程序设计中经常出现的INF和MOD值的设定

    摘自:https://www.cnblogs.com/gfvod/p/5548313.html 在取模操作中,我们常把MOD设置为1000000007,模一个大数和模一个质数可以减少冲突,而1e9+7 ...

  10. 【Linux】fg、bg让你的进程在前后台之间切换

    Linux下的fg和bg命令是进程的前后台调度命令,即将指定号码(非进程号)的命令进程放到前台或后台运行.比如一个需要长时间运行的命令,我们就希望把它放入后台,这样就不会阻塞当前的操作:而一些服务型的 ...