传送门

首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$

也就是说所有情况的和除以总的情况数

因为这是一条链,我们可以把边也转化成一个序列,用$i$表示$(i,i+1)$这一条边,那么只要把区间的右端点减一即可

。发现下面的$C_{r-l+1}^2$很好计算,考虑怎么计算上面的,转化,我们考虑每条边会被算多少次,那么答案变成$$\sum_{i=l}^r\sum_{j=i}^r{sum(i,j)}=\sum_{i=l}^rw_i(i-l+1)(r-i+1)$$

也就是说左端点取遍这条边左边的所有点,右端点也取遍右边的所有点

化简之后可以得到$$(r+1)(1-l)\sum w_i+(l+r)w_i*i-\sum w_i*i^2$$

然后用线段树维护即可

ps:$\sum w_i$很好维护,$\sum w_i*i$在区间加的时候用等差数列求和公式计算贡献,$\sum w_i*i^2$用公式$\sum_{i=1}^n i^2=\frac{(2n+1)n(n+1)}{6}$计算前缀和再相减来考虑贡献

pps:因为区间的右端点减一了,所以组合数应该变成$C_{r-l+2}^2$

 //minamoto
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
inline char getop(){
char ch;while((ch=getc())!='C'&&ch!='Q');return ch;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(ll x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e5+;
inline ll gcd(ll a,ll b){
if(!b) return a;
while(b^=a^=b^=a%=b);
return a;
}
inline ll calc(int x){return 1ll*(x<<|)*x*(x+)/;}
int n,m,tag[N<<];ll sum[N<<][];
#define ls (p<<1)
#define rs (p<<1|1)
inline void upd(int p){for(int i=;i<;++i)sum[p][i]=sum[ls][i]+sum[rs][i];}
inline void ppd(int p,int l,int r,int w){
int x=r-l+;tag[p]+=w;
sum[p][]+=1ll*x*w;
sum[p][]+=1ll*x*w*(l+r)>>;
sum[p][]+=1ll*w*(calc(r)-calc(l-));
}
inline void pd(int p,int l,int r){
int mid=(l+r)>>,w=tag[p];tag[p]=;
ppd(ls,l,mid,w),ppd(rs,mid+,r,w);
}
void update(int p,int l,int r,int ql,int qr,int w){
if(ql<=l&&qr>=r) return ppd(p,l,r,w);
int mid=(l+r)>>;if(tag[p]) pd(p,l,r);
if(ql<=mid) update(ls,l,mid,ql,qr,w);
if(qr>mid) update(rs,mid+,r,ql,qr,w);
upd(p);
}
ll query(int p,int l,int r,int ql,int qr,int t){
if(ql<=l&&qr>=r) return sum[p][t];
int mid=(l+r)>>;ll res=;if(tag[p]) pd(p,l,r);
if(ql<=mid) res+=query(ls,l,mid,ql,qr,t);
if(qr>mid) res+=query(rs,mid+,r,ql,qr,t);
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();--n;ll x,y,g;
while(m--){
char op=getop();int l=read(),r=read();--r;
if(op=='C') x=read(),update(,,n,l,r,x);
else{
y=1ll*(r-l+)*(r-l+)>>;
x=query(,,n,l,r,)*(r+)*(-l)+query(,,n,l,r,)*(l+r)-query(,,n,l,r,);
g=gcd(x,y);print(x/g),sr[C]='/',print(y/g);
}
}
return Ot(),;
}

洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)的更多相关文章

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

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

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

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

  3. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  4. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  5. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  6. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

  7. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...

  8. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

    正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...

  9. 题解——洛谷P2781 传教(线段树)

    可以说是数据结构学傻了的典型案例了 昨天跳到这题上 然后思考了一下 噫!好!线段树裸题 然后打完板子,发现\(  n \le 10^9 \) 显然线段树直接做不太行 然后这题又只有普及的难度 然后我就 ...

随机推荐

  1. 前端学习之-- JavaScript

    JavaScript笔记 参考:http://www.cnblogs.com/wupeiqi/articles/5602773.html javaScript是一门独立的语言,游览器都具有js解释器 ...

  2. Baby Step Giant Step model

    ******************************************** */ #include <stdio.h> #include <string.h> # ...

  3. git获取远程分支

    运行 git checkout -b local-branchname origin/remote_branchname  就可以将远程分支映射到本地命名为local-branchname  的一分支 ...

  4. Win7 SP1 安装SQL Server 2012时提示“此计算机上的操作系统不符合 SQL Server 2012的最低要求”

  5. Hadoop-异常-Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/avro/io/DatumReader

    //maven org.apache.avr 下载不完全 ,去maven   If you are using maven to build your jar, you need to add the ...

  6. react-loadable 进行代码分割的基本使用

    由上篇文章我们可以知道,我的项目,打包后的 js 是 7M 的,首屏就加载 7M 的文件虽然没什么特别大的缺点,但总不是最优的解决办法 因此我们用到了 react-router4 的 react-lo ...

  7. [故障处理]西部数据wd elements xp 无法识别

    百度后,看到如下帖子,供需要的朋友参考,黑体字为本人修改添加: http://blog.sina.com.cn/s/blog_539747670102w62w.html 经咨询WD厂商(厂商电话800 ...

  8. 2015/12/29 eclipse应用 输出三角形

    public class Myfirst { public static void main(String[] args) { System.out.println("hello world ...

  9. Lightoj 1024 - Eid

    求n个数的最小公倍数. import java.math.*; import java.io.*; import java.util.*; import java.text.*; public cla ...

  10. YTU 2982: 奔跑吧,小明!

    2982: 奔跑吧,小明! 时间限制: 1 Sec  内存限制: 128 MB 提交: 36  解决: 2 题目描述 小明陷入一个充满陷阱的密道之中,现在他要逃脱这里!到达密道的出口即可离开这处绝境! ...