P3924 康娜的线段树

看起来$O(nlogn)$可过其实由于巨大常数是无法通过的

$O(nlogn)$:70pts

我们手玩样例发现

线段树上某个节点的期望值$f[o]=(f[lc]+f[rc])/2+sum[o]$

$s[o]$表示该节点代表的区间和。

每次$Add(l,r,x)$时,每个x对于$f[o]$的贡献是固定的,即$f[o]+=x*k[o]$

这个$k[o]$可以在建树时预处理。

然鹅卡不过TAT

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef double db;
typedef long long ll;
template <typename T> void read(T &x){
static char c=getchar();x=; bool f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
x=f?x:-x;
}
#define N 4000005
int n,m,qwq; db f[N],k[N]; ll s[N],add[N];
#define lc o<<1
#define rc o<<1|1
#define mid (l+r)/2
inline void up(int o){s[o]=s[lc]+s[rc],f[o]=(f[lc]+f[rc])/2.0+s[o];}
void down(int o,int l,int r){
if(add[o]==) return ;
s[lc]+=1ll*(mid-l+)*add[o]; s[rc]+=1ll*(r-mid)*add[o];
f[lc]+=k[lc]*add[o]; f[rc]+=k[rc]*add[o];
add[lc]+=add[o]; add[rc]+=add[o]; add[o]=;
}
void build(int o,int l,int r){
if(l==r){read(s[o]); f[o]=s[o]; k[o]=1.0; return ;}
build(lc,l,mid); build(rc,mid+,r);
k[o]=+(k[lc]+k[rc])/2.0+(db)(r-l+); up(o);
}
void Add(int o,int l,int r,int x1,int x2,int v){
if(x1<=l&&r<=x2){
s[o]+=1ll*(r-l+)*v; f[o]+=k[o]*(db)v; add[o]+=v;
return ;
}down(o,l,r);
if(x1<=mid) Add(lc,l,mid,x1,x2,v);
if(x2>mid) Add(rc,mid+,r,x1,x2,v);
up(o);
}
int main(){
read(n);read(m);read(qwq); int q1,q2,q3;
build(,,n);
while(m--){
read(q1);read(q2);read(q3);
Add(,,n,q1,q2,q3);
printf("%.0lf\n",f[]*(db)qwq);
}return ;
}

$O(n)$:100pts

我们直接看每个叶节点对答案的贡献

贡献$=$概率$*$从根节点到该叶节点上的各点权值和

概率在建树时即可预处理,而权值和在询问时可以顺便处理掉

每次$Add(l,r,x)$时,考虑每个$x$对答案的贡献

$x \times \sum_{i=1}^{dep}{\frac{1}{2^{i-1}}}$

后面的东西是等比数列,可以化成$\frac{2^{dep}-1}{2^{dep-1}}$

区间修改的话就维护这个东西的前缀和

于是我们算出所有期望和再直接除以$2^{maxd}$就好辣

注意$2^{maxd}$与$qwq$需要约分,防爆精度

#include<iostream>
#include<cstdio>
#include<cstring>
typedef double db;
typedef long long ll;
inline int Max(int a,int b){return a>b?a:b;}
template <typename T> void read(T &x){
static char c=getchar();x=; bool f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
x=f?x:-x;
}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
#define N 1000005
int n,m,Md; ll sum[N<<],s[N],ans,y,qwq,d[N];
#define lc o<<1
#define rc o<<1|1
#define mid (l+r)/2
void build(int o,int l,int r,int D){
if(l==r){
read(sum[o]); d[l]=D; Md=Max(Md,D);
return ;
}build(lc,l,mid,D+); build(rc,mid+,r,D+);
sum[o]=sum[lc]+sum[rc];
}
ll Ask(int o,int l,int r,int t,ll tt){
if(l==r) return 1ll*(1ll<<t)*(tt+sum[o]);
return Ask(lc,l,mid,t-,tt+sum[o])+
Ask(rc,mid+,r,t-,tt+sum[o]);
}
int main(){
read(n);read(m);read(qwq); int q1,q2,q3;
build(,,n,);
ans=Ask(,,n,Md-,); y=1ll<<(Md-);
ll g=gcd(qwq,y); qwq/=g; y/=g;
for(int i=;i<=n;++i)
s[i]=s[i-]+1ll*((1ll<<d[i])-)*(1ll<<(Md-d[i]));
while(m--){
read(q1);read(q2);read(q3);
ans+=1ll*(s[q2]-s[q1-])*q3;
printf("%lld\n",ans/y*qwq);
}return ;
}

P3924 康娜的线段树(期望)的更多相关文章

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

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

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

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

  3. 洛谷 P3924 康娜的线段树

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

  4. P3924 康娜的线段树

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

  5. luogu P3924 康娜的线段树

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

  6. BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit] ...

  7. JZYZOJ1527 [haoi2012]高速公路 线段树 期望

    http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...

  8. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 736[Submit][Status][Discuss] Descripti ...

  9. CF895 E. Eyes Closed(线段树 期望)

    题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...

随机推荐

  1. CLR总览

    Contents 第1章CLR的执行模型... 4 1.1将源代码编译成托管代码模块... 4 1.2 将托管模块合并成程序集... 6 1.3加载公共语言运行时... 7 1.4执行程序集的代码.. ...

  2. node微信公众号开发---自动回复

    微信开发的特点:1.post请求 (一定要注意,这里和配置域名的时候不一样,配置域名是get请求)2.数据包是xml格式的3.你给微信返回的数据也是xml格式的 var parseString = r ...

  3. HTop依赖包

    htop 是一个 Linux 下的交互式的进程浏览器,可以用来替换Linux下的top命令. 1.安装HTop时需要先安装依赖包:rpmforge-release-0.5.3-1.el6.rf.x86 ...

  4. TM-align TM-score安装

    TM-align是由zhang yang LAB开发的一款做蛋白结构比对的软件. 下载链接:http://zhanglab.ccmb.med.umich.edu/TM-align/TMtools201 ...

  5. Pygame模块,功能表

    Pygame有很多的模块,下面是一张一览表: 模块名 功能 pygame.cdrom 访问光驱 pygame.cursors 加载光标 pygame.display 访问显示设备 pygame.dra ...

  6. WebService/WCF/WebAPI 之间的区别

    Web Service 1.数据的格式基于SOAP协议 2.数据的传输只支持HTTP协议 3.它只能部署在IIS上 WCF 1.数据的格式基于SOAP协议 2.数据的传输支持HTTP,HTTPS,TC ...

  7. nodejs发送邮件

    这里我主要使用的是 nodemailer 这个插件 第一步 下载依赖 cnpm install nodemailer --save 第二步 建立email.js 'use strict'; const ...

  8. 原型链(_proto_) 与原型(prototype) 有啥关系?

    prototype对象里面方法及属性是共享的...... 1.JavaScript 中每一个对象都拥有原型链(__proto__)指向其构造函数的原型( prototype),object._prot ...

  9. 从0开始搭建vue+webpack脚手架(三)

    在从0开始搭建vue+webpack脚手架(二)中已经基本完成了开发环境的配置.当开发完成后,我们需要将完成的项目进行打包,接下来对打包做一些优化: 运行 $ npm run build 可生成dis ...

  10. VS 应用模板 所交税和实发工资的运算

    double SFGZ, SL, SSKCS, YFGZ,a,YJS; //应发工资(基本工资),税率,速算扣除数,应发工资,判断标准,交多少税 //double QZD = 3500;//起征点 无 ...