P2221 [HAOI2012]高速公路

显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$

下面倒是挺好算,组合数瞎搞

上面咋算呢

先考虑每条边被算上的次数$ans = \sum_{i=l}^{r}a[i]*(r-i+1)(i-l+1)$

我们把它拆开再合并瞎搞,按变量$i$的次数分项

蓝后化出来这个式子:

$ans = (r - l- r*l+1) *S_{1}+ (l+r)*S_{2}-S_{3}$

$S_{1} = \sum_{i=l}^{r} a[i]$

$S_{2} = \sum_{i=l}^{r} a[i]*i$

$S_{3} = \sum_{i=l}^{r} a[i]*i*i$

显然这是可以用线段树维护的辣

区间添加$k$时

显然$S_{1}+=(r-l+1)*k$

$S_{2}+=\sum i *k$

$S_{3}+=\sum i*i *k$

再开俩数组维护下$S_{4}=\sum i $和$S_{5}=\sum i*i$就好辣

注意我们是按边开线段树,所以$r-=1$,组合数也要改为$C_{r-l+1}^2$

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
void read(int &x){
char c=getchar();x=; int f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
x=f?x:-x;
}
#define W 400005
int n,m; ll S1,S2,S3,ans,tot,g;
ll add[W],s1[W],s2[W],s3[W],s4[W],s5[W];
#define lc o<<1
#define rc o<<1|1
#define mid (l+r)/2
inline void up(int o){
s1[o]=s1[lc]+s1[rc],
s2[o]=s2[lc]+s2[rc],
s3[o]=s3[lc]+s3[rc];
}
void down(int o,int l,int r){
if(!add[o]) return ;
s1[lc]+=1ll*(mid-l+)*add[o], s1[rc]+=1ll*(r-mid)*add[o];
s2[lc]+=s4[lc]*add[o], s2[rc]+=s4[rc]*add[o];
s3[lc]+=s5[lc]*add[o], s3[rc]+=s5[rc]*add[o];
add[lc]+=add[o], add[rc]+=add[o]; add[o]=;
}
void build(int o,int l,int r){
if(l==r){s4[o]=l,s5[o]=1ll*l*l; return ;}
build(lc,l,mid); build(rc,mid+,r);
s4[o]=s4[lc]+s4[rc], s5[o]=s5[lc]+s5[rc];
}
void Add(int o,int l,int r,int x1,int x2,int v){
if(x1<=l&&r<=x2){
add[o]+=v, s1[o]+=(r-l+)*v,
s2[o]+=s4[o]*v, s3[o]+=s5[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);
}
void Ask(int o,int l,int r,int x1,int x2){
if(x1<=l&&r<=x2){
S1+=s1[o], S2+=s2[o], S3+=s3[o];
return ;
}down(o,l,r);
if(x1<=mid) Ask(lc,l,mid,x1,x2);
if(x2>mid) Ask(rc,mid+,r,x1,x2);
}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main(){
char opt[]; int l,r,v;
read(n);read(m); --n;
build(,,n);
while(m--){
scanf("%s",opt); read(l);read(r); --r;
if(opt[]=='C') read(v),Add(,,n,l,r,v);
else{
S1=S2=S3=; Ask(,,n,l,r);
ans=1ll*(r-l-1ll*l*r+)*S1+1ll*(l+r)*S2-S3;
tot=1ll*(r-l+)*(r-l+)/;
g=gcd(ans,tot); ans/=g; tot/=g;
printf("%lld/%lld\n",ans,tot);
}
}return ;
}

P2221 [HAOI2012]高速公路(线段树)的更多相关文章

  1. JZYZOJ1527 [haoi2012]高速公路 线段树 期望

    http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...

  2. 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)

    传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...

  3. 洛谷 P2221 [HAOI2012]高速公路

    链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...

  4. 洛谷P2221 [HAOI2012]高速公路

    线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...

  5. 【题解】Luogu P2221 [HAOI2012]高速公路

    原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...

  6. P2221 [HAOI2012]高速公路

    思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...

  7. luogu P2221 [HAOI2012]高速公路题解

    题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...

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

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

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

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

随机推荐

  1. 开发中清除css加载的缓存使用

  2. 第一弹:超全Python学习资源整理(入门系列)

    随着人工智能.大数据的时代到来,学习Python的必要性已经显得不言而喻.我经常逛youtube,发现不仅仅是以编程为职业的程序员,证券交易人员,生物老师,高级秘书......甚至许多自由撰稿人,设计 ...

  3. Centos7上安装及配置Apache

    Apache HTTP服务器是世界上最流行的Web服务器. 它是一款免费的开源和跨平台的HTTP服务器,提供强大的功能,可以通过各种模块进行扩展. 以下说明介绍如何在CentOS 7机器上安装和管理A ...

  4. 解决bug感觉

    解决bug,没有思路,很烦躁: 时间过去好久,还是没头绪,没结论: ...... ...... ...... ...... ...... 过了好久,这样还不如冷静下来,按照正确的方法(review代码 ...

  5. vue2.3时使用手机调试,提示媒体已断开的解决方案

    参考链接:http://www.xitonghe.com/jiaocheng/windows7-9623.html 1.在当前版本vue下开发,发现只能在localhost时调试,不能使用电脑的ip, ...

  6. 第二章:Opencv核心類Mat

    Opecv就是做計算機視覺,就是讲图片转换成计算机所能识别的数据 Mat类中由大量的内联函数,主要就是用于提高速度. 一般类型都用rgb,存的时候用CV_8UC3.create函数一般会把原来的空间释 ...

  7. OBV15 案例2

    BV

  8. Mongodb 分组查询例子

    db.tblCard.aggregate([     {         $match: {             "sNo": {                 " ...

  9. Unity shader学习之高光反射光照模型

    高光反射光照模型的公式如下: Cspecular = Clight * mspecular * max(0, dot(v, r))gloss 要计算高光反射需要知道4个参数:入射光线颜色Cspecul ...

  10. Python 5 -- 模块

    模块 - 模块就是包含函数的文件,用于共享代码. 导入已有模块 # 导入整个模块 import random # 导入整个模块 print(random.randint(0,255)) #调用模块中的 ...