题目大意:
给定一个长度为n的链,一共m次操作
对于每次操作
\(C\ l\ r\ x\)表示将第l个点到第r个点之间的所有道路的权值增加v

\(Q\ l\ r\)在第l个到第r个点里等概率随机取出两个不同的点a和b,那么从a行驶到b将期望花费多少费用呢

QwQ我们可以考虑将期望分为分子和分母两部分

首先考虑分母,分母就是在\(r-l+1\)个点中选两个点的方案数,也就是\({r-l+1}\choose 2\)

而分子就是总权值了

对于一个在\([l,r]\)的点\(i\)来说
它会被计算\((i-l+1)\times (r-i+1)\)次 (就跟分别在左右两个区间枚举端点是一样的)

那么我们求的东西也就变成了

\(\sum_{i=l}^{r} w[i]\times(i-l+1)\times(r-i+1)\)

我们考虑将它展开:
\(\sum_{i=l}^{r} w[i]\times((r+l)\times i-i\times i +(r-l+1-r\times l))\)

再进一步来一波,对于区间\([l,r]\)我们就是求的是:
\((r+l)\times \sum_{i=l}^{r}w[i]\times i + (r-l+1-r\times l)\times \sum_{i=l}^{r}w[i] + \sum_{i=l}^{r}w[i]*i^2\)

而对于更新,我们也不难找出一些规律了咯

所以对于一个区间,我们只需要维护一个\(w[i],w[i]*i,w[i]*i^2,i^2,i\)的sigma值就能处理更新和合并了!

void up(int root)
{f[root].si=f[2*root].si+f[2*root+1].si;f[root].sii=f[2*root].sii+f[2*root+1].sii;f[root].scostii=f[2*root].scostii+f[2*root+1].scostii;f[root].scosti=f[2*root].scosti+f[2*root+1].scosti;f[root].scost=f[2*root].scost+f[2*root+1].scost;
}void pushdown(int root,int l,int r)
{ll mid = (l+r) >> 1;if (add[root]){add[2*root]+=add[root];add[2*root+1]+=add[root];f[2*root].scost+=add[root]*(mid-l+1);f[2*root+1].scost+=add[root]*(r-mid);f[2*root].scosti+=add[root]*f[2*root].si;f[2*root+1].scosti+=add[root]*f[2*root+1].si;f[2*root].scostii+=add[root]*f[2*root].sii;f[2*root+1].scostii+=add[root]*f[2*root+1].sii;add[root]=0;}
}

emmmmm
query的时候也记得\(\times\)的时候要乘询问的总区间,而不是当然区间!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>
#define ll long long
using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 1e5+1e2;struct Node{ll scost,scosti,scostii,si,sii;ll ans;
};Node f[4*maxn];
ll add[4*maxn];
int n,m;ll count(int xx,int yy)
{ll x=xx,y=yy;return (y-x+1)*(y-x+2)/2;
}void up(int root)
{f[root].si=f[2*root].si+f[2*root+1].si;f[root].sii=f[2*root].sii+f[2*root+1].sii;f[root].scostii=f[2*root].scostii+f[2*root+1].scostii;f[root].scosti=f[2*root].scosti+f[2*root+1].scosti;f[root].scost=f[2*root].scost+f[2*root+1].scost;
}void pushdown(int root,int l,int r)
{ll mid = (l+r) >> 1;if (add[root]){add[2*root]+=add[root];add[2*root+1]+=add[root];f[2*root].scost+=add[root]*(mid-l+1);f[2*root+1].scost+=add[root]*(r-mid);f[2*root].scosti+=add[root]*f[2*root].si;f[2*root+1].scosti+=add[root]*f[2*root+1].si;f[2*root].scostii+=add[root]*f[2*root].sii;f[2*root+1].scostii+=add[root]*f[2*root+1].sii;add[root]=0;}
}void build(int root,int l,int r)
{if (l==r){f[root].si=(long long)1LL*l;f[root].sii=(long long) 1LL*l*l;return;}int mid = (l+r) >> 1;build(2*root,l,mid);build(2*root+1,mid+1,r);up(root);
}void update(int root,int l,int r,int x,int y,ll p)
{if (x<=l && r<=y){ll len=r-l+1;f[root].scost+=1LL*p*len;f[root].scosti+=1LL*p*f[root].si;f[root].scostii+=1LL*p*f[root].sii;add[root]+=p;return;}pushdown(root,l,r);int mid = (l+r) >> 1;if (x<=mid) update(2*root,l,mid,x,y,p);if (y>mid) update(2*root+1,mid+1,r,x,y,p);up(root);
}ll query(int root,int l,int r,int x,int y)
{if (x<=l && r<=y){ll xx = x,yy=y;return (long long)1LL*(xx+yy)*f[root].scosti+(long long)1LL*(yy-xx+1-xx*yy)*f[root].scost-f[root].scostii;}pushdown(root,l,r);int mid = (l+r) >> 1;ll ans=0;if (x<=mid) ans+=query(2*root,l,mid,x,y);if (y>mid) ans+=query(2*root+1,mid+1,r,x,y);return ans;
}int main()
{scanf("%d%d",&n,&m);n--;build(1,1,n); for (int i=1;i<=m;i++){char s[10];scanf("%s",s+1);if (s[1]=='C'){int x,y;ll z;scanf("%d%d%lld",&x,&y,&z);y--;update(1,1,n,x,y,z);}if (s[1]=='Q'){int x,y;scanf("%d%d",&x,&y);y--;ll tmp=query(1,1,n,x,y);ll tmp1=count(x,y);printf("%lld/%lld\n",tmp/__gcd(tmp1,tmp),tmp1/__gcd(tmp1,tmp));}}return 0;
}

转载于:https://www.cnblogs.com/yimmortal/p/10160724.html

HAOI2012高速公路bzoj2752 (线段树,数学)相关推荐

  1. BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1820  Solved: 736 [Submit][Status][Discuss] Descrip ...

  2. 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)

    传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...

  3. [luoguP2221] [HAOI2012]高速公路(线段树)

    传送门 考虑每一段对答案的贡献 用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1] 如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[ ...

  4. [bzoj2752]高速公路 题解(线段树)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 2102  Solved: 887 [Submi ...

  5. P6327 区间加区间sin和 线段树 + 数学

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,有mmm次操作,每次操作分两种类型: (1)l,r,v(1)l,r,v(1)l,r,v,将al,al+1,...,ara_l ...

  6. jzoj4231-寻找神格【线段树,数学】

    正题 题目大意 4个操作 单点修改,区间修改,区间求和,区间求方差 方差为:∑(xi−ave)2n\frac{\sum(x_i-ave)^2}{n}n∑(xi​−ave)2​ aveaveave为平均 ...

  7. CF311D Interval Cubing 数学、线段树

    CF311D Interval Cubing 数学.线段树 数学太重要了..有些人知道点结论就喜欢搞个数学包装水题,欺负吾等数学学渣啊... CF有官方题解,不过我还是记录一下吧. 这是个线段树的经典 ...

  8. P4588 [TJOI2018]数学计算(线段树维护区间乘和单点修改)

    P4588 [TJOI2018]数学计算 刚看到这题根本每想到用线段树,直接每次记录计算结果然后找到要除的数字就好了呗 但是!你会注意到,如果连续乘很多很多次,然后再除的话,如果不取模会爆 long ...

  9. Gym-101466K Random Numbers(线段树,数学,唯一分解定理)

    给一棵树,树上每个节点有一个权值,有两个操作,RAND操作查询u的子树乘积是多少以及有多少因数,SEED操作把节点u乘上v n,q <= 1e5.数值小于等于1e9,最大的质因数不超过13 组队 ...

  10. 小C的数学问题 线段树+分治

    题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n个数,每个数有权 ...

最新文章

  1. R语言ggplot2可视化在ggplot2生成的可视化结果下方显示文本:显示一些关于数据的信息
  2. protobuf中 repeated[Ptr]Field的序列化
  3. 构建springmvc+mybatis+dubbo分布式平台-dubbo简介
  4. 写给粪坑里的钻石——烂公司里的好员工
  5. springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...
  6. 牛逼了,用Python攻破wifi密码
  7. java 判断正负数_Java判断一个字符串为数字(正负、小数)
  8. 构建Blazor WASM和服务器一体化解决方案
  9. 十大经典排序算法(附代码、动画及改进方案)
  10. Java学习系列(十七)Java面向对象之开发聊天工具
  11. 动态规划之01背包问题和三角形问题
  12. opencv 物体形状匹配
  13. 谷歌大脑阿尔伯塔联合发表:离线强化学习的优化视角【附代码】
  14. 3.React学习笔记(完)----nodejs命令备份+跨域问题处理
  15. gis怎么通过水库划分子流域_分布式水文模型子流域划分方法
  16. JAVA多线程之状态转换图
  17. 优酷KUX1080转码工具如何将KUX视频转换成MP4格式 1
  18. winform小程序-随机抽奖软件
  19. android 7.0下载地址,android 7.0 Downloadprovider 下载流程
  20. Javascript的交互性

热门文章

  1. 未解决:fatal error: wasm.h: 没有那个文件或目录 #include <wasm.h>
  2. 搭建Eclipse 2020安卓开发环境
  3. Etcher/下载链接
  4. Windows BAT中7zip压缩时排除某些目录
  5. 编译OpenJDK8 b232版本
  6. 编译OpenJDK12:运行提示缺少freetype
  7. 程序员至少一半时间用于测试
  8. VirtualBox无法启动虚拟机的解决办法
  9. 管理感悟:每次争吵后要有进步
  10. STL的string