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. synchronized的简单用法

    synchronized 锁定要操作的对象: emp: synchronized(要锁定的对象){ //要做的动作 }

  2. Ext.create细节分析

    var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名 width: 800, title: 'define t ...

  3. HTTPS安全不?

    首先,它是什么?我的理解是一开始进行SSL握手,商量好将要使用哪些加密算法来通讯,或者加密方法后使用非对称的加密方法,交互一下随机数,加上一个pre-master-secrect的,然后服务端利用私钥 ...

  4. composer 用法

    构建工程 composer create-project test/name project_name help composer help create-project 参数 --prefer-di ...

  5. Stephen Wolfram自述

    Stephen Wolfram自述   作者: 阮一峰 大家听说过Stephen Wolfram(斯蒂芬·沃尔夫勒姆)吗? 了解他的经历和成就吗? 我对他了解不多,但是读了下面这篇2005年的演讲,联 ...

  6. 例子:动能并不是特别强(2-3)后,下M5的同时,也是恢复期到期的前一天

    动能并不是特别强(2-3)后,下M5的同时,但是恢复期到期 EG.002195 2017/06/23-->2017/06/29

  7. ssdb使用笔记

    ssdb是一款类似于redis的nosql数据库,不过redis是基于内存的,服务器比较昂贵,ssdb则是基于硬盘存储的,很容易扩展,对于一些对速度要求不是太高的应用,还是不错的选择. 先记录一个比较 ...

  8. fiddler2抓包数据工具使用教程

    一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断点.甚至修改输入输出数据 ...

  9. python 试题归纳及答疑 更新中.....

    一.Python基础篇(80题) 1.你为什么学习Python? 一.答题思路 1.阐述 python 优缺点 2.Python应用领域说明 3.根据自身工作情况阐述为什么会使用python 1)py ...

  10. LinkedList 底层实现原理

    LinkedList的底层实现原理 LinkedList 底层数据结构为双向链表,链表结构,基于一个个链表节点Node 1,Inner Class 内部类 private static class N ...