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 康娜的线段树(期望)的更多相关文章
- 洛谷P3924 康娜的线段树(期望 前缀和)
题意 题目链接 Sol 思路就是根据期望的线性性直接拿前缀和算贡献.. 这题输出的时候是不需要约分的qwq 如果你和我一样为了AC不追求效率的话直接#define int __int128就行了.. ...
- 洛谷 P3924 康娜的线段树 解题报告
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她\(OI\). 今天康娜学习了一种叫做线段树的神奇魔法,这种 ...
- 洛谷 P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息, ...
- P3924 康娜的线段树
P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的"魔法"产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以 ...
- luogu P3924 康娜的线段树
题面传送门 我们可以画图找规律 这里没图,要看图可以去看M_sea dalao的题解(逃 可以发现单个节点\(i\)对答案的贡献为该节点的点权\(*\frac{1}{2^{dep_i}}\)(\(de ...
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
- JZYZOJ1527 [haoi2012]高速公路 线段树 期望
http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- CF895 E. Eyes Closed(线段树 期望)
题意 Sol 今天考试的T3,,我本来留了一个小时去写.但是T2一刚就刚了两个小时 最后也没来的及写.. 然后考完 开始写,,25min就A了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...
随机推荐
- Windows 下MySql Replication(复制)配置
环境准备 到官网下载mysql-installer-web-community-5.7.21.0.msi并安装,选择MySql Workbench,记录安装时root输入的密码. 需要安装在两台机器上 ...
- python-列表解析、字典解析、集合解析
列表解析.字典解析.集合解析 列表解析 生成一个列表 nums = [1, 3, 9] list_gen = [num**2 for num in nums if x <= 5] # [1, 9 ...
- Redis:Sentinel哨兵
简介 Sentinel的作用就是主从切换:Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,R ...
- iOS LeftMenu抽屉效果与ScrollView共存时的手势冲突
公司有个项目,需要做左侧滑动,首页是ScrollView嵌套TableView.首页是一个ScrollView,所以当contentOffset是0.0的时候,无法直接滑动出抽屉效果,用户体验感非常差 ...
- python list成员函数extend与append的区别
extend 原文解释,是以list中元素形式加入到列表中 extend list by appending elements from the iterable append(obj) 是将整个ob ...
- Jenkins自动化构建(一)执行selenium+python脚本
Jenkins执行python写的selenium自动化脚本,通常会遇到,执行打不开浏览器,查看jenkins构建Console Output控制台输出信息,发现脚本是执行了的,但是出错了,打开浏览器 ...
- webpack打包二进制文件报错
错误示例,如下图所示: 修改webpack的module部分的rules,在其中添加一下代码: { test: /\.woff[0-9]{0,}$/, loader: "url-loader ...
- db2修改表结构,增加列,删除列等
增加一列:ALTER TABLE tbname ADD COLUMN columnName datatype; 增加多列:ALTER TABLE tbname ADD COLUMN columnNam ...
- jquery ajax 中各个事件执行顺序
jquery ajax 中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事 ...
- java virtual machine launcher Error:Could not create the Java Virtual Machine. Error:A Fatal exception has occurred,Program will exit.
Error:Could not create the Java Virtual Machine. Error:A Fatal exception has occurred,Program will e ...