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

Description

Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站。
Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用。高速路刚建成时所有的路段都是免费的。
政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价。
无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条高速路上行驶时想到了这样一个问题:对于给定的l,r(l<r),在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢?

Input

第一行2个正整数N,M,表示有N个收费站,M次调整或询问
接下来M行,每行将出现以下两种形式中的一种
C l r v 表示将第l个收费站到第r个收费站之间的所有道路的通行费全部增加v
Q l r   表示对于给定的l,r,要求回答小A的问题
所有C与Q操作中保证1<=l<r<=N

Output

对于每次询问操作回答一行,输出一个既约分数
若答案为整数a,输出a/1

Sample Input

4 5
C 1 4 2
C 1 2 -1
Q 1 2
Q 2 4
Q 1 4

Sample Output

1/1
8/3
17/6

HINT

数据规模

所有C操作中的v的绝对值不超过10000

在任何时刻任意道路的费用均为不超过10000的非负整数

所有测试点的详细情况如下表所示

Test N M

1 =10 =10

2 =100 =100

3 =1000 =1000

4 =10000 =10000

5 =50000 =50000

6 =60000 =60000

7 =70000 =70000

8 =80000 =80000

9 =90000 =90000

10 =100000 =100000

Source

这题跟期望有个鸡毛关系??

每个位置被选择的概率是相等的,因此每次询问的答案为

$\frac{\sum_{i = l}^r \sum_{j = i}^r dis(i, j)}{C_{r - l + 1}^2}$,

发现下面是个常数

上面比较难处理,考虑枚举每一个数的贡献$\sum_{i = l}^r a[i] * (r - i + 1) * (i - l + 1)$

然后展开,发现可以用线段树维护。

完了。。

  1. #include<cstdio>
  2. #include<algorithm>
  3. //#define LL long long
  4. #define int long long
  5. using namespace std;
  6. const int MAXN = * 1e5 + ;
  7. inline int read() {
  8. char c = getchar(); int x = , f = ;
  9. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  10. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  11. return x * f;
  12. }
  13. #define ls(k) k << 1
  14. #define rs(k) k << 1 | 1
  15. struct Node {
  16. int l, r, siz;
  17. int w[], tag;
  18. Node() {
  19. w[] = w[] = w[] = tag = l = r = ;
  20. }
  21. /*Node operator + (const Node &rhs) const {
  22. Node x = *this;
  23. for(int i = 0; i < 2; i++) x.w[i] += rhs.w[i];
  24. return x;
  25. }*/
  26. void print() {
  27. printf("%d %d %d\n", w[], w[], w[]);
  28. }
  29. }T[MAXN];
  30. void update(int k) {
  31. for(int i = ; i <= ; i++) T[k].w[i] = T[ls(k)].w[i] + T[rs(k)].w[i];
  32. }
  33. int calc(int n) {
  34. return ( * n + ) * (n + ) * n / ;
  35. }
  36. void down(int val, int k) {
  37. T[k].w[] += ((T[k].r + ) * T[k].r - (T[k].l ) * (T[k].l - )) / * val;
  38. T[k].w[] += (calc(T[k].r) - calc(T[k].l - )) * val;
  39. T[k].w[] += T[k].siz * val;
  40. T[k].tag += val;
  41. }
  42. void pushdown(int k) {
  43. if(!T[k].tag) return;
  44. down(T[k].tag, ls(k)); down(T[k].tag, rs(k));
  45. T[k].tag = ;
  46. }
  47. void Build(int k, int ll, int rr) {
  48. T[k].l = ll; T[k].r = rr; T[k].siz = rr - ll + ;
  49. if(ll == rr) return ;
  50. int mid = ll + rr >> ;
  51. Build(ls(k), ll, mid); Build(rs(k), mid + , rr);
  52. }
  53. void IntervalAdd(int k, int ll, int rr, int val) {
  54. if(ll <= T[k].l && T[k].r <= rr) {
  55. down(val, k); return ;
  56. }
  57. pushdown(k);
  58. int mid = (T[k].l + T[k].r) >> ;
  59. if(ll <= mid) IntervalAdd(ls(k), ll, rr, val);
  60. if(rr > mid) IntervalAdd(rs(k), ll, rr, val);
  61. update(k);
  62. }
  63. Node Merge(Node x, Node y) {
  64. for(int i = ; i <= ; i++)
  65. x.w[i] += y.w[i];
  66. return x;
  67. }
  68. Node IntervalAsk(int k, int ll, int rr) {
  69. Node ans;
  70. //ans.print();
  71. if(ll <= T[k].l && T[k].r <= rr) {
  72. ans = T[k];
  73. return ans;
  74. }
  75. pushdown(k);
  76. int mid = T[k].l + T[k].r >> ;
  77. //Node ls = IntervalAsk(ls(k), ll, rr);
  78. if(ll <= mid) ans = Merge(ans, IntervalAsk(ls(k), ll, rr));
  79. if(rr > mid) ans = Merge(ans, IntervalAsk(rs(k), ll ,rr));
  80. //ans.print();
  81. return ans;
  82. }
  83. int Query(int l, int r) {
  84. Node ans = IntervalAsk(, l, r);
  85. int up, down;
  86. down = (r - l + ) * (r - l + ) / ;
  87. up = ans.w[] * (r + l) - ans.w[] - ans.w[] * (r * l + l - r - );
  88. int gcd = __gcd(down, up);
  89. printf("%lld/%lld\n", up / gcd, down / gcd);
  90. }
  91. int N, Q;
  92. main() {
  93. N = read(); Q = read();
  94. Build(, , N);
  95. while(Q--) {
  96. char c = '-'; while(c != 'C' && c != 'Q') c = getchar();
  97. int l = read(), r = read(), v;
  98. if(c == 'C') v = read(), IntervalAdd(, l, r - , v);
  99. else Query(l, r - );
  100. }
  101. }

BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)的更多相关文章

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

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

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

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

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

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

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

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

  5. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

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

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

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

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

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

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

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

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

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

随机推荐

  1. JEECMS站群管理系统-- Jeecms项目导入myeclipse

    1.在myeclipse中新建一个项目jeecms,将服务器中jeecms项目下web-inf文件夹下内容拷到新建项目中 解压缩jeecms-3.0.2-final-src,在src文件夹下会看到有三 ...

  2. Hbase与传统数据库的区别

    在说HBase之前,我想再唠叨几句.做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户就变多了, ...

  3. HDU 5592——ZYB's Premutation——————【线段树单点更新、单点查询】

    ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

  4. D5上

    好慌啊 0分?? T1 感觉是组合数,不知道对不对. #include<iostream> #include<cstring> #include<cstdio> # ...

  5. C#入门--索引器

    C#入门--索引器 索引器允许类或结构的实例按照与数组相同的方式进行索引.索引器类似于属性,不同之处在于它们的访问器采用参数. 索引器概述 索引器使得对象可按照与数组相似的方法进行索引. get 访问 ...

  6. Java编译及装载

    Java类加载机制 JVM将类加载过程划分为三个步骤:装载.链接和初始化. 装载(Load):装载过程负责找到二进制字节码并加载至JVM中,JVM通过类的全限定名(com.bluedavy. Hell ...

  7. 非关系型数据库(NOSQL)-Redis

    整理一波Redis 简介,与memcached比较 官网:http://redis.io Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括 ...

  8. __getattr__,__getattribute__????

    class Foo(object): def __getattr__(sel,item): print('y') def __getattribute(self,item): print('x') o ...

  9. WHRER条件里的数据类型必须和字段数据类型一致

    首先看案例: 表中字段FPHONE_IMEI是varchar类型的,主键也建立在FPHONE_IMEI 字段上,原则上只要where条件中用到了这个字段,就会走索引,这也是建立索引的目的,可事实是这样 ...

  10. SqlServer-Cursor讲解一

    原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-s-cu ...