披着期望外衣的数据结构?

非常毒瘤

我们要求得期望其实就是

\[\frac{\sum_{i=l}^{r}\sum_{j=i+1}^{r}dis(i,j)}{\binom{r-l+1}{2}}
\]

好像非常难求的样子

我记得慎老师曾经教过我今天的那道线段期望的初赛题,其实这道题和那道初赛题非常的像

老师教给我的思路是每次都将区间拆成两半来考虑,之后就会得到一个无穷等比数列

好像线段树就非常自然的每次将区间拆成了两半考虑

我们用\(d(x)\)表示线段树\(x\)节点管辖的区间内所有区间的和,显然合并的时候

\[d(x)=d(x<<1)+d(x<<1|1)
\]

这是不跨区间的情况

还需要考虑跨区间的情况

\[d(x)+=ls(x<<1)*len(x<<1|1)+rs(x<<1|1)*len(x<<1)
\]

\(ls,rs\)表示从左/右开始的所有区间的长度和

剩下的比较简单随便推一下就好了

有点困难的是\(pushdown\)的时候\(d(x)\)如何维护,由于这里是抄的题解里的柿子,所以这里手推一波

增加量应该对应到每一个区间上去,于是考虑枚举每一种长度的区间有多少个

\[\sum_{i=1}^{len}i*(len-i+1)*val
\]

\[=\sum_{i=1}^{len}i*(len+1)*val-i^2*val
\]

\[=val*((len+1)*\sum_{i=1}^{len}i-\sum_{i=1}^{len}i^2)
\]

\[=val*(\frac{len*(len+1)^2}{2}-\frac{(len+1)(2*len+1)len}{6})
\]

就好了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 100005
#define LL long long
#define int long long
LL l[maxn<<2],r[maxn<<2];
LL tag[maxn<<2],d[maxn<<2],ls[maxn<<2],rs[maxn<<2],s[maxn<<2];
struct node
{
LL len,lc,rc,sum,t;
};
int n,Q;
inline int read()
{
char c=getchar();
int x=0,r=1;
while(c<'0'||c>'9')
{
if(c=='-') r=-1;
c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x*r;
}
LL gcd(LL a,LL b)
{
if(!b) return a;
return gcd(b,a%b);
}
void build(int x,int y,int i)
{
l[i]=x,r[i]=y;
if(x==y) return;
int mid=x+y>>1;
build(x,mid,i<<1),build(mid+1,y,i<<1|1);
}
inline void pushup(int i)
{
d[i]=d[i<<1|1]+d[i<<1];
d[i]+=(r[i<<1]-l[i<<1]+1)*ls[i<<1|1]+rs[i<<1]*(r[i<<1|1]-l[i<<1|1]+1);
s[i]=s[i<<1|1]+s[i<<1];
ls[i]=ls[i<<1],rs[i]=rs[i<<1|1];
ls[i]+=(r[i<<1|1]-l[i<<1|1]+1)*s[i<<1]+ls[i<<1|1];
rs[i]+=(r[i<<1]-l[i<<1]+1)*s[i<<1|1]+rs[i<<1];
}
inline void pushdown(int i)
{
if(!tag[i]) return;
s[i<<1]+=(r[i<<1]-l[i<<1]+1)*tag[i],s[i<<1|1]+=(r[i<<1|1]-l[i<<1|1]+1)*tag[i];
d[i<<1]+=((r[i<<1]-l[i<<1]+2)*(r[i<<1]-l[i<<1]+1)/2*(r[i<<1]-l[i<<1]+2)-(r[i<<1]-l[i<<1]+1)*(r[i<<1]-l[i<<1]+2)*(2*(r[i<<1]-l[i<<1]+1)+1)/6)*tag[i];
d[i<<1|1]+=((r[i<<1|1]-l[i<<1|1]+2)*(r[i<<1|1]-l[i<<1|1]+1)/2*(r[i<<1|1]-l[i<<1|1]+2)-(r[i<<1|1]-l[i<<1|1]+1)*(r[i<<1|1]-l[i<<1|1]+2)*(2*(r[i<<1|1]-l[i<<1|1]+1)+1)/6)*tag[i];
ls[i<<1]+=(r[i<<1]-l[i<<1]+2)*(r[i<<1]-l[i<<1]+1)/2*tag[i];
ls[i<<1|1]+=(r[i<<1|1]-l[i<<1|1]+2)*(r[i<<1|1]-l[i<<1|1]+1)/2*tag[i];
rs[i<<1]+=(r[i<<1]-l[i<<1]+2)*(r[i<<1]-l[i<<1]+1)/2*tag[i];
rs[i<<1|1]+=(r[i<<1|1]-l[i<<1|1]+2)*(r[i<<1|1]-l[i<<1|1]+1)/2*tag[i];
tag[i<<1]+=tag[i],tag[i<<1|1]+=tag[i];
tag[i]=0;
}
void change(int x,int y,int i,int val)
{
if(x<=l[i]&&y>=r[i])
{
s[i]+=(r[i]-l[i]+1)*val;
d[i]+=((r[i]-l[i]+2)*(r[i]-l[i]+1)/2*(r[i]-l[i]+2)-(r[i]-l[i]+1)*(r[i]-l[i]+2)*(2*(r[i]-l[i]+1)+1)/6)*val;
ls[i]+=(r[i]-l[i]+1)*(r[i]-l[i]+2)/2*val;
rs[i]+=(r[i]-l[i]+1)*(r[i]-l[i]+2)/2*val;
tag[i]+=val;
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) change(x,y,i<<1,val);
else if(x>mid) change(x,y,i<<1|1,val);
else change(x,y,i<<1,val),change(x,y,i<<1|1,val);
pushup(i);
}
node query(int x,int y,int i)
{
if(x<=l[i]&&y>=r[i]) return (node){r[i]-l[i]+1,ls[i],rs[i],s[i],d[i]};
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) return query(x,y,i<<1);
if(x>mid) return query(x,y,i<<1|1);
node L=query(x,y,i<<1),R=query(x,y,i<<1|1),now;
now.sum=L.sum+R.sum;
now.t=L.t+R.t;
now.t+=R.len*L.rc+L.len*R.lc;
now.len=R.len+L.len;
now.lc=L.lc,now.rc=R.rc;
now.lc+=R.len*L.sum+R.lc;
now.rc+=L.len*R.sum+L.rc;
return now;
}
signed main()
{
n=read(),Q=read();
char opt[1];
build(1,n-1,1);
int x,y,z;
while(Q--)
{
scanf("%s",opt);
if(opt[0]=='C')
{
x=read(),y=read(),z=read();
if(x<y) change(x,y-1,1,z);
}
else
{
x=read(),y=read();
node ans=query(x,y-1,1);
LL r=gcd(ans.t,(y-x)*(y-x+1)/2);
printf("%lld/%lld\n",ans.t/r,(y-x)*(y-x+1)/2/r);
}
}
return 0;
}

【[HAOI2012]高速公路】的更多相关文章

  1. BZOJ2752: [HAOI2012]高速公路(road)

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

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

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

  3. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

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

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

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

  5. P2221 [HAOI2012]高速公路(线段树)

    P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...

  6. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

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

    [HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...

  8. bzoj 2752: [HAOI2012]高速公路(road)

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...

  9. BZOJ2752:[HAOI2012]高速公路——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...

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

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

随机推荐

  1. Winform学习之随笔一:Log4net

    前提题要:因为我最近负责的Winform项目,好多都用到了这个log4net的日志功能,开发程序对数据一般都要求做到雁过留痕,所以日志对于我们程序员是不可或缺.因此我把对log4net的使用做一个记录 ...

  2. 一、hbase单机安装

    下文将快速构建并启动单节点hbase,不使用hdfs作为存储,不使用独立的zookeeper hbase官网:http://hbase.apache.org/ 一.JDK环境 hbase需要JDK环境 ...

  3. 一键安装lamp环境出现的问题

    前言:之前安装lamp是独立安装的,安装扩展很方便,现在用这个一键安装包,不知道怎么样,尝试一把. Part1:安装过程中出现的问题 error: utf8_mime2text() has new s ...

  4. Hbase配置指南

    注意点 Hbase 需要zookeeper. Hbase 需要在各个节点的机器上配置. 集群中的启动顺序是Hadoop.zookeeper 和Hbase 搭建步骤 解压安装文件并配置环境变量. exp ...

  5. Java 双亲委派模型

    1. Java 类加载器的分类 2. 双亲委派模型 Parents Delegration Model

  6. docker离线安装 启动报错Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

    安装报错的提示:systemctl status docker.service 好吧,原来是缺少库文件.验证一下想法吧,yum -y install libseccomp 成功后,再启动docker发 ...

  7. Django,COOKIES,SESSION完成用户登入

    1.urls.py """Django_cookie_session URL Configuration The `urlpatterns` list routes UR ...

  8. Git简介、安装与配置

    老规矩QAQ,先来简单介绍一下Git: Git是一个分布式版本控制系统,可以理解为是一个用于管理代码,控制版本,方便多人合作开发的一款工具. Git:分布式版本控制系统. SVN.CVS:集中式版本控 ...

  9. Android BitmapFactory.Options

    public Bitmap inBitmap 如果设置,解码选项“对象的方法,采取将尝试重用这个位图加载内容时. public int inDensity 使用的位图的象素密度. public boo ...

  10. VS2010 创建 windows service 程序

    参考网上保护眼睛程序,自写程序如下. 1.创建一个名词为“CareEyeService”,类型为“WindowsService”的应用程序. 自动生成代码如下图: 2.修改ServiceCareEye ...