题目https://www.luogu.org/problemnew/show/P2221

题意:有n个节点排成一条链,相邻节点之间有一条路。

C u v val表示从u到v的路径上的每条边权值都加val。

Q l r表示在l到r中等概率选择两个城市的路径长度的期望值。

思路:首先期望值的分子肯定是可以选择的方案数也就是$C^2_{r - l + 1}$

分子应该是所有可能的路径和。我们可以通过计算每一条边算了多少次得到。

对于第$i$条边,他的左端点有$(i - l + 1)$种可能,右端点有$(r - i + 1)$种可能。因此这$(i - l + 1)*(r - i + 1)$种路径都包含第$i$条边

所以分子可以表示为$\sum_{l}^{r}(i-l+1)*(r - i + 1) * a[i]$

把含$i$的和不含的都分离出来。可以变为$(r - l + 1-r*l)\sum a[i] + (r + l)\sum i *a[i] - \sum i^2*a[i]$

分别用线段树维护$\sum a[i], \sum i * a[i], \sum i^2 * a[i]$

小trick是$i$和$i^2$之和也可以保存在线段树节点中,维护起来比较方便。

 #include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n, m;
const int maxn = 1e5 + ;
struct node{
LL i, a, ia, ii, iia, lazy;
}tree[maxn * ]; void build(int rt, int l, int r)
{
if(l == r){
tree[rt].i = l;
tree[rt].ii = 1ll * l * l;
return;
}
int mid = (l + r) / ;
build(rt << , l, mid);
build(rt << | , mid + , r);
tree[rt].i = tree[rt << ].i + tree[rt << | ].i;
tree[rt].ii = tree[rt << ].ii + tree[rt << | ].ii;
} void pushdown(int rt, int l, int r)
{
if(tree[rt].lazy){
tree[rt << ].lazy += tree[rt].lazy;
tree[rt << | ].lazy += tree[rt].lazy;
int mid = (l + r) / ;
tree[rt << ].a += 1ll * tree[rt].lazy * (mid - l + );
tree[rt << | ].a += 1ll * tree[rt].lazy * (r - mid);
tree[rt << ].ia += 1ll * tree[rt].lazy * tree[rt << ].i;
tree[rt << |].ia += 1ll * tree[rt].lazy * tree[rt << |].i;
tree[rt << ].iia += 1ll * tree[rt].lazy * tree[rt << ].ii;
tree[rt << |].iia += 1ll * tree[rt].lazy * tree[rt << |].ii;
tree[rt].lazy = ;
} } void pushup(int rt)
{
tree[rt].a = tree[rt << ].a + tree[rt << |].a;
tree[rt].ia = tree[rt << ].ia + tree[rt << | ].ia;
tree[rt].iia = tree[rt << ].iia + tree[rt << | ].iia;
} void update(int L, int R, int l, int r, int rt, int val)
{
if(L <= l && R >= r){
tree[rt].a += 1ll * val * (r - l + );
tree[rt].ia += 1ll * val * tree[rt].i;
tree[rt].iia += 1ll * val * tree[rt].ii;
tree[rt].lazy += val;
return;
}
pushdown(rt, l, r);
int mid = (l + r) / ;
if(L <= mid)update(L, R, l, mid, rt << , val);
if(R > mid)update(L, R, mid + , r, rt << | , val);
pushup(rt);
} LL sum1, sum2, sum3;
void query(int L, int R, int l, int r, int rt)
{
if(L <= l && R >= r){
sum1 += tree[rt].a;
sum2 += tree[rt].ia;
sum3 += tree[rt].iia;
return;
}
pushdown(rt, l, r);
int mid = (l + r) / ;
if(L <= mid)query(L, R, l, mid, rt << );
if(R > mid)query(L, R, mid + , r, rt << | ); } LL gcd(LL a, LL b)
{
if(!b)return a;
else return gcd(b, a % b);
}
int main()
{
scanf("%d%d", &n, &m);
build(, , n - );
for(int i = ; i < m; i++){
string type;
int l, r;
cin>>type>>l>>r; r--;
if(type[] == 'C'){
int val;
scanf("%d", &val);
update(l, r, , n - , , val);
}
else{
sum1 = sum2 = sum3 = ;
query(l, r, , n - , );
LL fac = (1ll * r - l + - 1ll * r * l) * sum1 + (r + l) * sum2 - sum3;
LL div = 1ll * (r - l + ) * (r - l + ) / ;
// cout<<sum1<<" "<<sum2<<" "<<sum3<<endl;
// cout<<fac<<" "<<div<<endl;
LL g = gcd(fac, div);
fac /= g;
div /= g;
printf("%lld/%lld\n", fac, div);
}
}
return ;
}

最新文章

  1. OpenCASCADE PCurve of Topological Face
  2. 【原】iOS学习之第三方-AFNetworking1.3.0
  3. java基础练习[一]
  4. struts2集成javamail发邮件(带附件)实践记录
  5. ocp 1Z0-047 131-276题解析
  6. Shell中read的选项及用法
  7. java 正则操作之获取
  8. 【asp.net爬虫】asp.NET分页控件抓取第n页数据 javascript:__doPostBack
  9. 《招聘一个靠谱的iOS》面试题参考答案(上)
  10. 实现ModelDriver接口的功能
  11. Android自定义shape的使用
  12. JavaScript基础学习(五)&mdash;其他引用类型
  13. angular.run和angular.config的区别
  14. Nginx作为HTTP服务器--Nginx配置图片服务器
  15. ubuntu linux 安装分区
  16. C++中int与string的转化
  17. react入门学习及总结
  18. SVN快速入门笔记【转】
  19. CentOS systemctl命令
  20. Linux系列:Fedora虚拟机设置固定IP上网(配置IP、网关、DNS、防止resolv.conf被重写)

热门文章

  1. ssh使用
  2. Quartz入门以及相关表达式使用
  3. windows + Eclipse 汉化
  4. C#汉字转换成全拼的拼音
  5. centos7 GNOME 安装微信客户端
  6. Vue 单元测试 使用mocha+jest
  7. c# dynamic实现动态实体,不用定义实体就能序列化为标准json
  8. 2.synchronized同步锁
  9. centos 7.6 配置VNC
  10. Computer Vision_33_SIFT:Robust scale-invariant feature matching for remote sensing image registration——2009