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. 对k8s service的一些理解

    服务service service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务 举个例子一个a服务运行3个pod,b服务怎么访问a服务的pod, ...

  2. zyb的面试(广工14届比赛)

    这道题目在上半年ZOJ模拟上年青岛赛区ACM题的时候就已经出现了.当时我不会写,本来想着赛后补题的最后因为懒惰又没补. 现在这道题又出现了.这是上天对我的惩罚啊!!! 所以这次铁了心也要补这题.然后我 ...

  3. leetcode 22括号生成

    非常好的一道题.一开始的思想是这样的,先把n对括号按照某一顺序生成一个string,然后用全排列算法生成所有可能,然后利用stack写一段判断括号是否匹配的字符串,匹配的假如结果中.不过会超时.因为全 ...

  4. python filter函数应用,过滤字符串

    >>> candidate = 'dade142.;!0142f[.,]ad' >>> filter(str.isdigit, candidate) #保留数字 ' ...

  5. ROSETTA使用技巧随笔--score.sc处理

    对score.sc的便利操作: $ sort -n -k2 example_score_file.sc 此命令会以score文件的第二列进行排序(sort -n -k2,-n表示对数值型数据排序,可用 ...

  6. Web API 入门 二 媒体类型

    还是拿上面 那篇 Web API 入门 一  的那个来讲 在product类中加一个时间属性

  7. ZOJ 3690 Choosing number(矩阵)

    Choosing number [题目链接]Choosing number [题目类型]矩阵 &题解: 这题就和已经dp极像了,所以找方程就很困难了.可以这样找: 设f(n)是前n-1个人已经 ...

  8. python入门之列表

    1.列表基本格式# list 类 列表li = [1, 2, 3, "sb", ["时间",[9, 10], "huang"], 6, 7, ...

  9. Service Fabric本地开发部署修改数据目录

    以修改5节点非安全模式为例: 在C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\NonSecure\FiveNode目录下,修改 ...

  10. tp 例子=登录逻辑

    <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller{ ...