链接:

P2221


题意:

有 \(n(1\leq n\leq 10^5)\) 个点,从第 \(i(1\leq i< n)\) 个点向第 \(i+1\) 个点连有边。最初所有边长 \(v_i\) 为 \(0\)。

有 \(m(1\leq m\leq 10^5)\) 次操作:

  • 操作 \(1\):'C' l r v 表示将 \(l\) 和 \(r\) 之间的所有边长度加上 \(v\)。
  • 操作 \(2\):'Q' l r 在第 \(l\) 个到第 \(r\) 个点里等概率随机取出两个不同的点 \(a\) 和 \(b\),询问 \(a,b\) 的期望距离。

保证:\(1\leq l\leq r\leq n,-10^4\leq v\leq 10^4\),任意时刻满足 \(0\leq v_i\leq 10^4\)。


分析:

分析询问操作,显然是问距离的平均数,也就是\(\dfrac{\sum\limits_{i=l}^{r-1}\sum\limits_{j=i+1}^rdis[i][j]}{(r-l+1)\times(r-l)/2}\)。

分母可以直接算,分子比较难算。

首先化边为点,查询 \([l,r]\) 之间的边也就是 \([l,r-1]\) 的边。

考虑每条边被计算的次数,枚举左右两边的端点,则 \(ans=\sum\limits_{i=l}^{r-1}v[i]\times(i-l+1)\times(r-i+1)\)。

把式子拆开后得到:

\(ans=\sum\limits_{i=l}^{r-1}v[i]*i^2+(l+r)\sum\limits_{i=l}^{r-1}v[i]*i+(-l*r+r-l+1)*\sum\limits_{i=l}^{r-1}v[i]\)

\(\sum\) 前面的东西可以提出来,所以我们只需要每次查询 \(\sum\limits_{i=l}^{r-1}v[i]*i^2,\sum\limits_{i=l}^{r-1}v[i]*i,\sum\limits_{i=l}^{r-1}v[i]\)

线段树维护这三个值,分别记为 \(sum1,sum2,sum3\)

pushup 时直接相加:

  1. inline void pushup(int p){
  2. sum1(p)=sum1(p<<1)+sum1(p<<1|1);
  3. sum2(p)=sum2(p<<1)+sum2(p<<1|1);
  4. sum3(p)=sum3(p<<1)+sum3(p<<1|1);
  5. }

修改时,\(sum1\) 加上 \(d*\sum\limits_{i=l}^ri^2\),\(sum2\) 加上 \(d*\sum\limits_{i=l}^ri\),\(sum3\) 加上 \(d*\sum\limits_{i=l}^r1\)。这些东西都可以 \(O(1)\) 搞出来。

所以分子就维护好了。

由于对边的操作需要我们让 \(r-1\),但分母中的 \(r\) 不能减,所以在 \(r-1\) 后,分母要变成 \((r-l+2)\times(r-l+1)/2\)。

于是这道题就做完了。时间复杂度 \(O(n\log n)\)。


代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. #define in read()
  5. inline int read(){
  6. int p=0,f=1;
  7. char c=getchar();
  8. while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
  9. while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
  10. return p*f;
  11. }
  12. const int N=1e5+5;
  13. int n,m;
  14. inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
  15. #define sum1(x) t[x].sum1
  16. #define sum2(x) t[x].sum2
  17. #define sum3(x) t[x].sum3
  18. #define tag(x) t[x].tag
  19. inline int sumi1(int l,int r){return (l+r)*(r-l+1)/2;}
  20. inline int sumi2(int l,int r){return r*(r+1)/2*(2*r+1)/3-(l-1)*l/2*(2*l-1)/3;}
  21. struct node{
  22. int sum1,sum2,sum3,tag;
  23. }t[N<<2];
  24. inline void pushup(int p){
  25. sum1(p)=sum1(p<<1)+sum1(p<<1|1);
  26. sum2(p)=sum2(p<<1)+sum2(p<<1|1);
  27. sum3(p)=sum3(p<<1)+sum3(p<<1|1);
  28. }
  29. inline void f(int l,int r,int p,int d){
  30. tag(p)+=d;
  31. sum1(p)+=sumi2(l,r)*d;
  32. sum2(p)+=sumi1(l,r)*d;
  33. sum3(p)+=(r-l+1)*d;
  34. }
  35. inline void pushdown(int l,int r,int p){
  36. if(tag(p)){
  37. int mid=(l+r)>>1;
  38. f(l,mid,p<<1,tag(p));
  39. f(mid+1,r,p<<1|1,tag(p));
  40. tag(p)=0;
  41. }
  42. }
  43. inline void change(int l,int r,int p,int cl,int cr,int d){
  44. if(l>=cl&&r<=cr){f(l,r,p,d);return ;}
  45. pushdown(l,r,p);
  46. int mid=(l+r)>>1;
  47. if(cl<=mid)change(l,mid,p<<1,cl,cr,d);
  48. if(cr>mid)change(mid+1,r,p<<1|1,cl,cr,d);
  49. pushup(p);
  50. }
  51. struct ret{
  52. int sum1,sum2,sum3;
  53. };
  54. ret operator+(const ret &x,const ret &y){
  55. ret z;
  56. z.sum1=x.sum1+y.sum1;
  57. z.sum2=x.sum2+y.sum2;
  58. z.sum3=x.sum3+y.sum3;
  59. return z;
  60. }
  61. inline ret query(int l,int r,int p,int ql,int qr){
  62. if(l>=ql&&r<=qr){return {sum1(p),sum2(p),sum3(p)};}
  63. pushdown(l,r,p);
  64. int mid=(l+r)>>1;
  65. ret t={0,0,0};
  66. if(ql<=mid)t=t+query(l,mid,p<<1,ql,qr);
  67. if(qr>mid)t=t+query(mid+1,r,p<<1|1,ql,qr);
  68. return t;
  69. }
  70. signed main(){
  71. n=in,m=in;
  72. for(int i=1;i<=m;i++){
  73. char c[5];
  74. cin>>c;
  75. if(c[0]=='C'){
  76. int l=in,r=in-1,d=in;
  77. change(1,n,1,l,r,d);
  78. }
  79. else{
  80. int l=in,r=in-1;
  81. ret ans=query(1,n,1,l,r);
  82. int ans1=-ans.sum1+(l+r)*ans.sum2+(r-l+1-l*r)*ans.sum3;
  83. int ans2=(r-l+2)*(r-l+1)/2;
  84. int t=gcd(ans1,ans2);
  85. ans1/=t,ans2/=t;
  86. cout<<ans1<<"/"<<ans2<<'\n';
  87. }
  88. }
  89. return 0;
  90. }

洛谷 P2221 [HAOI2012]高速公路的更多相关文章

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

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

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

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

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

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

  4. 洛谷 P2220 [HAOI2012]容易题 数论

    洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...

  5. 洛谷P2221 高速公路【线段树】

    题目:https://www.luogu.org/problemnew/show/P2221 题意:有n个节点排成一条链,相邻节点之间有一条路. C u v val表示从u到v的路径上的每条边权值都加 ...

  6. 洛谷 P2505 [HAOI2012]道路 解题报告

    P2505 [HAOI2012]道路 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它 ...

  7. 洛谷 P1877 [HAOI2012]音量调节

    P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...

  8. 洛谷P1877 [HAOI2012]音量调节 [2017年4月计划 动态规划05]

    P1877 [HAOI2012]音量调节 题目描述 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量.在演出开始之前,他已经做好一个列表,里面 ...

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

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

随机推荐

  1. ysoserial CommonsColletions5分析

    我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject进行了改写. 所以要挖掘出一条能替代的类BadAttributeValueExpE ...

  2. 远程桌面连接(mstsc)全攻略

    打算从今天开始,写一写我经常用的,有长时间使用经验的东西,与大家分享,就从mstsc开始吧! mstsc应该是在Windows中,除了calc.cmd.notepad.mspaint,我使用率最高的系 ...

  3. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. DS博客作业04--图

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...

  5. Java基础系列(28)- 方法的定义和调用

    方法的定义 Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法: 修饰符 返回值类型 方法名(参数类型 参数名){ -- 方法体 -- retu ...

  6. @ConfigurationProperties与@Value的区别

    1. 首先我们来看每一个的具体使用 1. ConfigurationProperties 1. application.yml文件中: person: lastName: xj age: 18 bos ...

  7. 分布式、微服务必须配个日志管理系统才优秀,Exceptionless走起~~~

    前言 在真实的项目中,不管是功能日志.错误日志还是异常日志,已经是项目的重要组成部分.在原始的单体架构,通常看日志的方式简单粗暴,直接登录到服务器,把日志文件拷贝下来进行分析:而如今分布式.微服务架构 ...

  8. JVM学习笔记——栈区

    栈区 Stack Area 栈是运行时的单位,堆是存储单位,栈解决程序的运行问题,即程序如何执行,如何处理数据. 每个线程在创建时都创建一个该线程私有的虚拟机栈,每个栈里有许多栈帧,一个栈帧对应一个 ...

  9. NOIP模拟77

    前言 感觉最近太飘了,这次考试是挺好的一次打击(好像也不算是). 犯了一个智障错误(双向边一倍数组 100pts->30pts)别的就.. T1 最大或 解题思路 一开始我以为是一个找规律,然而 ...

  10. 题解 Beautiful Pair

    题目传送门 题目大意 给出一个 \(n\) 个点的序列 \(a_{1,2,...,n}\) ,问有多少对点对 \((i,j)\) 满足 \(a_i\times a_j\le a_k(i\le k\le ...