传送门

首先,答案等于$$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. Delphi控件大全

    首先来大体上为控件分一下类,以方便我们后面的讨论.   但因为控件的种类太多,所以就粗略的分为如下几个类别∶   ---界面风格类   ---Shell外观类   ---Editor类   ---Gr ...

  2. Educational Codeforces Round 50 (Rated for Div. 2)F. Relatively Prime Powers

    实际上就是求在[2,n]中,x != a^b的个数,那么实际上就是要求x=a^b的个数,然后用总数减掉就好了. 直接开方求和显然会有重复的数.容斥搞一下,但实际上是要用到莫比乌斯函数的,另外要注意减掉 ...

  3. HDU 2059 【DP】

    题意: 中文. 思路: 这题不是自己的思想. 当对第i个点的最优值进行求解的时候一定存在最后一个加油的点j.这里j直接枚举. 另外将0和n+1个加油站定义为起点和终点. dp需要加强训练. #incl ...

  4. 转: 关于Linux常用的二进制文件分析方法

    当你在unix下拿到一个二进制文件但不知道它是什么的时候,可以通过以下方法得到一此提示 1. 最首先应该尝试strings命令,比如拿到一个叫cr1的二进制文件,可以: $ strings cr1 | ...

  5. freeswitch电话代接

    Misc. Dialplan Tools intercept Description Allows one channel to bridge itself to the a or b leg of ...

  6. ArcGIS Engine中的Symbols详解

    转自原文ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式) ...

  7. how to read openstack code: loading process

    之前我们了解了neutron的结构,plugin 和 extension等信息.这一章我们看一下neutron如何加载这些plugin和extension.也就是neutron的启动过程.本文涉及的代 ...

  8. C# 错误!!容量超出了最大容量。参数名: capacity 这个是什么问题呢?

    C# 错误!!容量超出了最大容量.参数名: capacity 这个是什么问题呢?   对于这个问题我纠结了好久老是报错误,报这个错误的原因是应为我加了皮肤的控件,在没有加皮肤控件的时候没有这个错误, ...

  9. InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts

    在一台server中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用. 之前执行一直没有问题(最多的时候有23个MySQL实例同一时候执行).后来新配置了一台server ...

  10. OpenCV实践之路——Python的安装和使用

    本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/50936076 微博:http ...