题面

很套路的拆式子然后线段树上维护区间和的题。一般都是把式子拆成区间内几个形如\(\sum i*a_i, \sum i^2 * a_i\)的式子相加减的形式。

考虑一次询问[l,r]的答案怎么算:

\[ans=\sum_{i=l}^{r}a_i*(i-l+1)*(r-i+1)
\]

把括号拆开,就成了:

\[(l+r)\sum_{i=l}^{r}a_i*i-\sum_{i=l}^{r}a_i*i^2-(l-1)*(r+1)\sum_{i=l}^{r}a_i
\]

线段树上维护区间\(\sum i^2*a_i\)的和即可。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 200007
  4. #define ll long long
  5. struct data
  6. {
  7. ll s1,s2,s3;
  8. };
  9. data operator +(data l,data r)
  10. {
  11. return (data){l.s1+r.s1,l.s2+r.s2,l.s3+r.s3};
  12. }
  13. data operator *(data v,ll d)
  14. {
  15. return (data){v.s1*d,v.s2*d,v.s3*d};
  16. }
  17. int n;
  18. struct Tree
  19. {
  20. #define lc (k<<1)
  21. #define rc (k<<1|1)
  22. data val[N<<2],sum[N<<2];
  23. ll add[N<<2];
  24. void mark(int k,ll d)
  25. {
  26. val[k]=val[k]+sum[k]*d;
  27. add[k]+=d;
  28. }
  29. void pushdown(int k)
  30. {
  31. mark(lc,add[k]);
  32. mark(rc,add[k]);
  33. add[k]=0;
  34. }
  35. void build(int k,int l,int r)
  36. {
  37. if(l==r)
  38. {
  39. sum[k]={1,l,1ll*l*l};
  40. return;
  41. }
  42. int mid=l+r>>1;
  43. build(lc,l,mid),build(rc,mid+1,r);
  44. sum[k]=sum[lc]+sum[rc];
  45. }
  46. void modify(int k,int l,int r,int x,int y,ll d)
  47. {
  48. if(l>=x&&r<=y)return mark(k,d);
  49. int mid=l+r>>1;
  50. pushdown(k);
  51. if(x<=mid)modify(lc,l,mid,x,y,d);
  52. if(y>mid)modify(rc,mid+1,r,x,y,d);
  53. val[k]=val[lc]+val[rc];
  54. }
  55. data query(int k,int l,int r,int x,int y)
  56. {
  57. if(l>=x&&r<=y)return val[k];
  58. int mid=l+r>>1;
  59. data ans={0,0,0};
  60. pushdown(k);
  61. if(x<=mid)ans=ans+query(lc,l,mid,x,y);
  62. if(y>mid)ans=ans+query(rc,mid+1,r,x,y);
  63. return ans;
  64. }
  65. void mdy(int l,int r,ll d)
  66. {
  67. modify(1,1,n,l,r,d);
  68. }
  69. ll ask(ll l,ll r)
  70. {
  71. data ans=query(1,1,n,l,r);
  72. return (l+r)*ans.s2-ans.s3-(l-1)*(r+1)*ans.s1;
  73. }
  74. }T;
  75. ll gcd(ll x,ll y)
  76. {
  77. return y?gcd(y,x%y):x;
  78. }
  79. int main()
  80. {
  81. int m;
  82. scanf("%d%d",&n,&m),n--;
  83. int l,r;
  84. ll d;
  85. char s[10];
  86. T.build(1,1,n);
  87. for(int i=1;i<=m;i++)
  88. {
  89. scanf("%s%d%d",s,&l,&r);r--;
  90. if(s[0]=='C')
  91. {
  92. scanf("%lld",&d);
  93. T.mdy(l,r,d);
  94. }
  95. else
  96. {
  97. ll x=T.ask(l,r),len=r-l+1,y=1ll*len*(len+1)/2;
  98. ll gd=gcd(x,y);
  99. printf("%lld/%lld\n",x/gd,y/gd);
  100. }
  101. }
  102. return 0;
  103. }

luogu P2221 [HAOI2012]高速公路题解的更多相关文章

  1. 【题解】Luogu P2221 [HAOI2012]高速公路

    原题传送门 这道题还算简单 我们要求的期望值: \[\frac{\sum_{i=l}^r\sum_{j=l}^rdis[i][j]}{C_{r-l+1}^{2}}\] 当然是上下两部分分别求,下面肥肠 ...

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

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

  3. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

  4. BZOJ2752:[HAOI2012]高速公路——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2752 https://www.luogu.org/problemnew/show/P2221#sub ...

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

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

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

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

  7. P2221 [HAOI2012]高速公路

    思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...

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

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

  9. BZOJ2752: [HAOI2012]高速公路(road)

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

随机推荐

  1. (二十二)golang--时间和日期相关函数

    时间的常量,可以获得指定时间单位 Unix和UnixNano   小例子:统计函数运行的时间:

  2. npm install说明

    一.常用简写 npm install=npm i.在git clone项目的时候,项目文件中并没有 node_modules文件夹,项目的依赖文件可能很大.直接执行,npm会根据package.jso ...

  3. Go gRPC Hello World

    概述 开始 gRPC 了,这篇文章学习使用 gRPC,输出一个 Hello World. 用 Go 实现 gRPC 的服务端. 用 Go 实现 gRPC 的客户端. gRPC 支持 4 类服务方法,咱 ...

  4. Express 框架以及与http-proxy-middleware整合实现代理

    1.Express的简单使用 1.简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Exp ...

  5. Linux iSCSI 磁盘共享管理

    Linux iSCSI 磁盘共享管理 iSCSI 服务是通过服务端(target)与客户端(initiator)的形式来提供服务.iSCSI 服务端用于存放存储源的服务器,将磁盘空间共享给客户使用,客 ...

  6. ExcelHelper based on NPOI

    //Export data to excel via NPOI public static void ExportDataTableToExcel(DataTable dataTable, strin ...

  7. Spring Boot MVC 使用 JSP 作为模板

    Spring Boot 默认使用 Thymeleaf 作为模板引擎,直接在 template 目录中存放 JSP 文件并不能正常访问,需要在 main 目录下新建一个文件夹来存放 JSP 文件,而且需 ...

  8. PHP 类/对象函数

    PHP类/对象函数是PHP核心的一部分,无需要安装就可以使用. 函数名称 描述 __autoload 尝试加载未定义的类 class_alias 为一个类创建别名 class_exists 检查类是否 ...

  9. Qt发送邮件

    首先下载支持库 https://download.csdn.net/download/zhangxuechao_/10598108 #ifndef MAIL_H #define MAIL_H #inc ...

  10. 白话SCRUM 之二:product backlog

    在SCRUM方法中明确要求了3个文档: 1 product backlog 2sprint backlog 3 burn-down chart Product backlog 中列举了本项目应该实现的 ...