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

非常毒瘤

我们要求得期望其实就是

\[\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. C# 字符串处理—— 去除首位保留其他

    //去除首位 public static string RemoveFirstPlace(string s) { ) //输入空值直接Return { ")) //判断开头是否是零 s = ...

  2. Cheatsheet: 2018 01.01 ~ 02.28

    JAVA How to Improve the Performance of a Java Application Java Memory Management Writing Java Micros ...

  3. .net core 导出excel

    1.使用NuGet 安装 EPPlus.Core, 2.代码如下 using OfficeOpenXml; using OfficeOpenXml.Style; public IActionResul ...

  4. Spring Boot学习笔记(三)实现热部署

    pom文件中添加如下依赖即可 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  5. 学习Golang的步骤建议

    一.快速入门 通过快速入门可以宏观的了解Go相关知识.快速入门可以去学习 go-tour 国内可以访问的中文版的 go-tour 地址有下面一些: http://gotour.qizhanming.c ...

  6. java设计模式-----9、观察者模式

    Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态. Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对 ...

  7. 百度翻译cs文件英文注释

    原由:本人英语烂,没办法看不懂国外的代码注释!只能借助其他手段来助我一臂之力了. 虽然翻译内容不是很准确,但好过什么都看不懂的强. 对吧?! 代码有点乱有用的园友自个整理一下吧! 最近没时间所以翻译后 ...

  8. Redis实现分布式锁2

    redisTemplate实现分布式锁 /** * 分布式锁-加锁 * @param key * @param value 当前时间+超时时间 System.currentTimeMillis()+t ...

  9. HMTL label标签

    label标签和特定表单控件关联之后,如果用户在 label 元素内点击文本,就会触发关联的表单控件.就是说,当用户选择该label标签时,浏览器就会自动将焦点转到和label标签相关的表单控件上. ...

  10. canvas toDataURL() 方法如何生成部分画布内容的图片

    HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI .可以使用 type参数其类型,默认为 PNG 格式.图片的分辨率为96dpi. 如果画布的高 ...