题目大意:

给定一个长度为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值就能处理更新和合并了!

  1. void up(int root)
  2. {
  3. f[root].si=f[2*root].si+f[2*root+1].si;
  4. f[root].sii=f[2*root].sii+f[2*root+1].sii;
  5. f[root].scostii=f[2*root].scostii+f[2*root+1].scostii;
  6. f[root].scosti=f[2*root].scosti+f[2*root+1].scosti;
  7. f[root].scost=f[2*root].scost+f[2*root+1].scost;
  8. }
  9. void pushdown(int root,int l,int r)
  10. {
  11. ll mid = (l+r) >> 1;
  12. if (add[root])
  13. {
  14. add[2*root]+=add[root];
  15. add[2*root+1]+=add[root];
  16. f[2*root].scost+=add[root]*(mid-l+1);
  17. f[2*root+1].scost+=add[root]*(r-mid);
  18. f[2*root].scosti+=add[root]*f[2*root].si;
  19. f[2*root+1].scosti+=add[root]*f[2*root+1].si;
  20. f[2*root].scostii+=add[root]*f[2*root].sii;
  21. f[2*root+1].scostii+=add[root]*f[2*root+1].sii;
  22. add[root]=0;
  23. }
  24. }

emmmmm

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<cstdlib>
  7. #include<queue>
  8. #include<map>
  9. #include<vector>
  10. #define ll long long
  11. using namespace std;
  12. inline int read()
  13. {
  14. int x=0,f=1;char ch=getchar();
  15. while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
  16. while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  17. return x*f;
  18. }
  19. const int maxn = 1e5+1e2;
  20. struct Node{
  21. ll scost,scosti,scostii,si,sii;
  22. ll ans;
  23. };
  24. Node f[4*maxn];
  25. ll add[4*maxn];
  26. int n,m;
  27. ll count(int xx,int yy)
  28. {
  29. ll x=xx,y=yy;
  30. return (y-x+1)*(y-x+2)/2;
  31. }
  32. void up(int root)
  33. {
  34. f[root].si=f[2*root].si+f[2*root+1].si;
  35. f[root].sii=f[2*root].sii+f[2*root+1].sii;
  36. f[root].scostii=f[2*root].scostii+f[2*root+1].scostii;
  37. f[root].scosti=f[2*root].scosti+f[2*root+1].scosti;
  38. f[root].scost=f[2*root].scost+f[2*root+1].scost;
  39. }
  40. void pushdown(int root,int l,int r)
  41. {
  42. ll mid = (l+r) >> 1;
  43. if (add[root])
  44. {
  45. add[2*root]+=add[root];
  46. add[2*root+1]+=add[root];
  47. f[2*root].scost+=add[root]*(mid-l+1);
  48. f[2*root+1].scost+=add[root]*(r-mid);
  49. f[2*root].scosti+=add[root]*f[2*root].si;
  50. f[2*root+1].scosti+=add[root]*f[2*root+1].si;
  51. f[2*root].scostii+=add[root]*f[2*root].sii;
  52. f[2*root+1].scostii+=add[root]*f[2*root+1].sii;
  53. add[root]=0;
  54. }
  55. }
  56. void build(int root,int l,int r)
  57. {
  58. if (l==r)
  59. {
  60. f[root].si=(long long)1LL*l;
  61. f[root].sii=(long long) 1LL*l*l;
  62. return;
  63. }
  64. int mid = (l+r) >> 1;
  65. build(2*root,l,mid);
  66. build(2*root+1,mid+1,r);
  67. up(root);
  68. }
  69. void update(int root,int l,int r,int x,int y,ll p)
  70. {
  71. if (x<=l && r<=y)
  72. {
  73. ll len=r-l+1;
  74. f[root].scost+=1LL*p*len;
  75. f[root].scosti+=1LL*p*f[root].si;
  76. f[root].scostii+=1LL*p*f[root].sii;
  77. add[root]+=p;
  78. return;
  79. }
  80. pushdown(root,l,r);
  81. int mid = (l+r) >> 1;
  82. if (x<=mid) update(2*root,l,mid,x,y,p);
  83. if (y>mid) update(2*root+1,mid+1,r,x,y,p);
  84. up(root);
  85. }
  86. ll query(int root,int l,int r,int x,int y)
  87. {
  88. if (x<=l && r<=y)
  89. {
  90. ll xx = x,yy=y;
  91. return (long long)1LL*(xx+yy)*f[root].scosti+(long long)1LL*(yy-xx+1-xx*yy)*f[root].scost-f[root].scostii;
  92. }
  93. pushdown(root,l,r);
  94. int mid = (l+r) >> 1;
  95. ll ans=0;
  96. if (x<=mid) ans+=query(2*root,l,mid,x,y);
  97. if (y>mid) ans+=query(2*root+1,mid+1,r,x,y);
  98. return ans;
  99. }
  100. int main()
  101. {
  102. scanf("%d%d",&n,&m);
  103. n--;
  104. build(1,1,n);
  105. for (int i=1;i<=m;i++)
  106. {
  107. char s[10];
  108. scanf("%s",s+1);
  109. if (s[1]=='C')
  110. {
  111. int x,y;
  112. ll z;
  113. scanf("%d%d%lld",&x,&y,&z);
  114. y--;
  115. update(1,1,n,x,y,z);
  116. }
  117. if (s[1]=='Q')
  118. {
  119. int x,y;
  120. scanf("%d%d",&x,&y);
  121. y--;
  122. ll tmp=query(1,1,n,x,y);
  123. ll tmp1=count(x,y);
  124. printf("%lld/%lld\n",tmp/__gcd(tmp1,tmp),tmp1/__gcd(tmp1,tmp));
  125. }
  126. }
  127. return 0;
  128. }

HAOI2012高速公路bzoj2752 (线段树,数学)的更多相关文章

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

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

  2. 【bzoj2752】[HAOI2012]高速公路(road) 线段树

    题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西 ...

  3. 2019.01.14 bzoj2752: [HAOI2012]高速公路(线段树)

    传送门 线段树菜题. 题意简述:给一条nnn个点的链,链有边权,支持区间修改边权,查询在一段区间内随机选择不同的起点和终点路径的期望总边权和. 思路:考虑每条边的贡献. 考虑对于一段区间[l,r][l ...

  4. BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

  5. BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1219  Solved: 446[Submit] ...

  6. P2221 [HAOI2012]高速公路(线段树)

    P2221 [HAOI2012]高速公路 显然答案为 $\dfrac{\sum_{i=l}^r\sum_{j=l}^{r}dis[i][j]}{C_{r-l+1}^2}$ 下面倒是挺好算,组合数瞎搞 ...

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

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

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

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

  9. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

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

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

随机推荐

  1. 一个简单的 aiax请求例子

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  2. MySQL-SQL基础-查询1

    #子查询-某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就要用到子查询.用于子查询的关键字主要包括: in.not in.=.!=.exists.not exist ...

  3. (五)羽夏看C语言——结构体与类

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  4. Python - repr()、str() 的区别

    总的来说 str():将传入的值转换为适合人阅读的字符串形式 repr():将传入的值转换为 Python 解释器可读取的字符串形式 传入整型 # number resp = str(1) print ...

  5. Xshell破~~解和SecureCRT破~~解办法,亲测可行

    解决办法很简单,那就是安装MobaXterm, 安装上即可使用,无需破击,免费,功能同样强大,不比xshell, SecureCRT功能差.它是集万千功能于一身的全能型终端神器. 听名字就不会太差,看 ...

  6. 远程线程注入DLL

    远程线程注入 0x00 前言 远程线程注入是一种经典的DLL注入技术.其实就是指一个新进程中另一个进程中创建线程的技术. 0x01 介绍 1.远程线程注入原理 画了一个图大致理解了下远程线程注入dll ...

  7. weblogic漏洞分析之CVE-2021-2394

    weblogic漏洞分析之CVE-2021-2394 简介 Oracle官方发布了2021年7月份安全更新通告,通告中披露了WebLogic组件存在高危漏洞,攻击者可以在未授权的情况下通过IIOP.T ...

  8. [第六篇]——云服务器之Spring Cloud直播商城 b2b2c电子商务技术总结

    云服务器 云服务器(Elastic Compute Service, ECS)是一种简单高效.安全可靠.处理能力可弹性伸缩的计算服务. 云服务器管理方式比物理服务器更简单高效,我们无需提前购买昂贵的硬 ...

  9. 获取office版本

    /// <summary>         /// office版本         /// </summary>         public enum OfficeVers ...

  10. 第七章:网络优化与正则化(Part1)

    任何数学技巧都不能弥补信息的缺失. --科尼利厄斯·兰佐斯(Cornelius Lanczos) 匈牙利数学家.物理学家 文章相关 1 第七章:网络优化与正则化(Part1) 2 第七章:网络优化与正 ...