传送门

考虑每一段对答案的贡献

用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1]

如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[x]为这一段的权值)

化简后得x*s[x]*(l+r-1)-s[x]*(l*r-r)-x*x*s[x]

那么我们就需要维护x*s[x],s[x],x*x*s[x]

其中还需要预处理出来x和x*x

然后就ok了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #define N 500001
  5. #define LL long long
  6. #define root 1, 1, n - 1
  7. #define ls now << 1, l, mid
  8. #define rs now << 1 | 1, mid + 1, r
  9.  
  10. using namespace std;
  11.  
  12. int n, m;
  13. LL s, xs, xxs, ans1, ans2;
  14. LL x1[N], x2[N], sum1[N], sum2[N], sum3[N], add[N];
  15. //x1表示 x
  16. //x2表示 x^2
  17. //sum1表示 s[x]
  18. //sum2表示 x * s[x]
  19. //sum3表示 x^2 * s[x]
  20.  
  21. inline int read()
  22. {
  23. int x = 0, f = 1;
  24. char ch = getchar();
  25. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
  26. for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  27. return x * f;
  28. }
  29.  
  30. inline void push_down(int now, int l, int r)
  31. {
  32. if(add[now])
  33. {
  34. int mid = (l + r) >> 1;
  35. sum1[now << 1] += 1ll * add[now] * (mid - l + 1);
  36. sum1[now << 1 | 1] += 1ll * add[now] * (r - mid);
  37. sum2[now << 1] += add[now] * x1[now << 1];
  38. sum2[now << 1 | 1] += add[now] * x1[now << 1 | 1];
  39. sum3[now << 1] += add[now] * x2[now << 1];
  40. sum3[now << 1 | 1] += add[now] * x2[now << 1 | 1];
  41. add[now << 1] += add[now];
  42. add[now << 1 | 1] += add[now];
  43. add[now] = 0;
  44. }
  45. }
  46.  
  47. inline void push_up(int now)
  48. {
  49. sum1[now] = sum1[now << 1] + sum1[now << 1 | 1];
  50. sum2[now] = sum2[now << 1] + sum2[now << 1 | 1];
  51. sum3[now] = sum3[now << 1] + sum3[now << 1 | 1];
  52. }
  53.  
  54. inline void update(int now, int l, int r, int x, int y, LL z)
  55. {
  56. if(x <= l && r <= y)
  57. {
  58. add[now] += z;
  59. sum1[now] += 1ll * z * (r - l + 1);
  60. sum2[now] += 1ll * z * x1[now];
  61. sum3[now] += 1ll * z * x2[now];
  62. return;
  63. }
  64. push_down(now, l, r);
  65. int mid = (l + r) >> 1;
  66. if(x <= mid) update(ls, x, y, z);
  67. if(mid < y) update(rs, x, y, z);
  68. push_up(now);
  69. }
  70.  
  71. inline void build(int now, int l, int r)
  72. {
  73. if(l == r)
  74. {
  75. x1[now] += l;
  76. x2[now] += 1ll * l * l;
  77. return;
  78. }
  79. int mid = (l + r) >> 1;
  80. build(ls);
  81. build(rs);
  82. x1[now] = x1[now << 1] + x1[now << 1 | 1];
  83. x2[now] = x2[now << 1] + x2[now << 1 | 1];
  84. }
  85.  
  86. inline void query(int now, int l, int r, int x, int y)
  87. {
  88. if(x <= l && r <= y)
  89. {
  90. s += sum1[now];
  91. xs += sum2[now];
  92. xxs += sum3[now];
  93. return;
  94. }
  95. push_down(now, l, r);
  96. int mid = (l + r) >> 1;
  97. if(x <= mid) query(ls, x, y);
  98. if(mid < y) query(rs, x, y);
  99. }
  100.  
  101. inline LL gcd(LL x, LL y)
  102. {
  103. return !y ? x : gcd(y, x % y);
  104. }
  105.  
  106. int main()
  107. {
  108. LL g, z;
  109. int i, x, y;
  110. char c[10];
  111. n = read();
  112. m = read();
  113. build(root);
  114. while(m--)
  115. {
  116. scanf("%s", c);
  117. if(c[0] == 'C')
  118. {
  119. x = read();
  120. y = read();
  121. z = read();
  122. update(root, x, y - 1, z);
  123. }
  124. else
  125. {
  126. x = read();
  127. y = read();
  128. s = xs = xxs = 0;
  129. query(root, x, y - 1);
  130. ans2 = 1ll * (1 + y - x) * (y - x) / 2;
  131. ans1 = 1ll * xs * (x + y - 1) - s * (1ll * x * y - y) - xxs;
  132. g = gcd(ans1, ans2);
  133. printf("%lld/%lld\n", ans1 / g, ans2 / g);
  134. }
  135. }
  136. return 0;
  137. }

  

一个longlong调了我45min,WNM

[luoguP2221] [HAOI2012]高速公路(线段树)的更多相关文章

  1. JZYZOJ1527 [haoi2012]高速公路 线段树 期望

    http://172.20.6.3/Problem_Show.asp?id=1527 日常线段树的pushdown写挂,果然每次写都想得不全面,以后要注意啊……求期望部分也不熟练,和平均数搞混也是or ...

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

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

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

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

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

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

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

    [HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y ...

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

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

  7. 高速公路 [HAOI2012] [线段树]

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

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

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

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

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

随机推荐

  1. Xilinx FPGA结构

    FPGA是什么?FPGA是现场可编程逻辑阵列,由可编程逻辑资源(LUT和 REG),可编程连线,可编程I/O构成.Xilinx的FPGA的基本结构是一样的,但随着半导体工艺的发展,FPGA的逻辑容量越 ...

  2. 洛谷 1164 小A点菜

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...

  3. struts2默认拦截器defaultStack

    第一次使用Struts2.3.20,前台页面向后台传值,怎么总是提示值为null,查找半天原来是struts配置文件的action中忘记引入defaultStack拦截器了,所以即使Action中万事 ...

  4. 字符串赋值方式理解 sizeof 和strlen的一些区别

    #include<stdio.h>#include<string.h>  int main(){ int a,i=0; char ch[10000]; while(scanf( ...

  5. Robot Framework(十) 执行测试用例——测试执行

    3.2测试执行 本节描述如何执行从解析的测试数据创建的测试套件结构,如何在失败后继续执行测试用例,以及如何正常停止整个测试执行. 3.2.1执行流程 执行套房和测试 设置和拆卸 执行顺序 3.2.2继 ...

  6. OpenCV Haar AdaBoost源码改进据说是比EMCV快6倍

    <pre name="code" class="cpp">#include "Haar.h" #include "lo ...

  7. glassfish配置中数据库密码加密方法

    glassfish配置中数据库密码加密方法 Glassfish中的数据库连接池需要使用密文保存数据库密码.如果不是,则可按如下方法可配置 通过Glassfish中的Alias实现,配置方法如下: 1. ...

  8. 删除链表的倒数第N个节点(三种方法实现)

    删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒 ...

  9. 【dp 状态压缩 单调栈】bzoj3591: 最长上升子序列

    奇妙的单调栈状压dp Description 给出1~n的一个排列的一个最长上升子序列,求原排列可能的种类数. Input 第一行一个整数n. 第二行一个整数k,表示最长上升子序列的长度. 第三行k个 ...

  10. PHP获取文件后缀的7中方法

    在日常的工作当中我们避免不了要经常获取文件的后缀名,今天我就整理了一下7种获取文件后缀的方法,希望对大家有所帮助. $url = 'http://www.baidu.com/uploads/20185 ...