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]高速公路(线段树)的更多相关文章
- JZYZOJ1527 [haoi2012]高速公路 线段树 期望
http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- 洛谷 P2221 [HAOI2012]高速公路
链接: P2221 题意: 有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边.最初所有边长 \(v_i\) ...
- 洛谷P2221 [HAOI2012]高速公路
线段树 #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...
- 【题解】Luogu P2221 [HAOI2012]高速公路
原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...
- P2221 [HAOI2012]高速公路
思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...
- luogu P2221 [HAOI2012]高速公路题解
题面 很套路的拆式子然后线段树上维护区间和的题.一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式. 考虑一次询问[l,r]的答案怎么算: ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
随机推荐
- [LeetCode] 586. Customer Placing the Largest Number of Orders_Easy tag;SQL
Query the customer_number from the orders table for the customer who has placed the largest number o ...
- python beautiful soup库的超详细用法
原文地址https://blog.csdn.net/love666666shen/article/details/77512353 参考文章https://cuiqingcai.com/1319.ht ...
- python的赋值,深拷贝和浅拷贝的区别
原文地址https://www.cnblogs.com/xueli/p/4952063.html 赋值:a = [1,2,3,["a","b"]] b=a,那 ...
- cocos JS 定时器
cocos2d-js的定时器的创建跟使用: 情况一: var TestLayer = cc.Layer.extend({ sprite:null, ctor:function () { this.sc ...
- 收集:C# WinForm获取当前路径汇总
Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏 //获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType().Assembly.Loc ...
- node.js初识08
1.模块的概念,在前端的世界里,jq和js的关系,在后台里就是express和原生node的关系, 2.每一个js里的函数都只在当前文件里起作用,如果你希望在其他js里调用这个函数,这么你需要在这个j ...
- webpack的使用二
1.安装 Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample project),在终端中转到该文件夹后执行下述指令就可以完成安装 //全局安装 npm i ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- 记dynamic的一个小坑 -- RuntimeBinderException:“object”未包含“xxx”的定义
from:http://blog.csdn.net/feiyun0112/article/details/39697955 创建一个控制台程序和一个类库, 在控制台创建一个匿名对象,然后再在类库中访问 ...
- Introduction to debugging neural networks
http://russellsstewart.com/notes/0.html The following advice is targeted at beginners to neural netw ...