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了.. 感觉自己太高估自己的思维,太低估自己的码力了... ...
随机推荐
- leetcode 198打家劫舍
讲解视频见刘宇波leetcode动态规划第三个视频 记忆化搜索代码: #include <bits/stdc++.h> using namespace std; class Solutio ...
- cocos2d-js 遮挡层(禁止触摸事件传递层)
在游戏中,我们经常会碰到一些弹窗,这些弹窗禁止点透,也就是禁止触摸事件传递到底层,我们称之为遮挡层,这些遮挡层,需要开发遮挡层,我们首先得了解cocos2d-js的触摸传递机制,本文主要针对cocos ...
- Container(容器)与 Injector(注入)
Container(容器): History: containerd于2014年出生于Docker,最初是Docker引擎的低层运行时管理器.继2017年3月被CNCF接受之后,containerd已 ...
- C#学习入门第一篇
1. using System; using System.Collections.Generic; using System.Ling; using System.Text; using Syste ...
- 删掉centos原有的openjdk并安装sun jdk
[环境变量]删掉centos原有的openjdk并安装sun jdk 一.卸载原有openjdk rpm -qa | grep java 之后,将展示出来的全部卸载掉,我这里是5个 rpm -e ...
- programmatically detect whenever test run is in debug mode
if (System.Diagnostics.Debugger.IsAttached) // code or timeout value when running tests in debug ...
- Android -- 实现RecyclerView可拖拽Item
1,今天和大家一起实现RecyclerView可拖拽Item,主要是使用RecyclerView结合ItemTouchHelper来实现的,来看一下效果 2,看一下怎么实现的呢,很简单,只需要给rec ...
- Unity3d之如何截屏
Unity3d中有时有截屏的需求,那如何截屏呢,代码如下: /// <summary> /// 截屏 /// </summary> /// <param name=&qu ...
- redis 知识点
默认端口 6379 单个value 最大可以保存1G 默认RDB(异步刷盘方式) 禁用持久化修改redis.conf,找到save配置,改为save "" 即可 1. 特点 Re ...
- vs2013未找到与约束匹配的导出
解决方法: 1.关闭VS: 2.去C:/Users/<your users name>/AppData/Local/Microsoft/VisualStudio/12.0/Componen ...