题意:

有n个数的一个数组a,有两个操作:

1 l r:查询区间[l,r]内$a[l]*(r-l+1)+a[l+1]*(r-l)+a[l+2]*(r-l-1)+\cdots+a[r-1]*2+a[r]$

2 l r:将a[l]修改为r

n<=1e5,  a[i]<=1e9

思路:

预处理出前缀和s[i], 则操作1变为查询$s[l]+s[l+1]+..+s[r]-(r-l+1)*s[l-1]$

为防止爆ll(其实也不会爆的)可以在查询操作力就提前减去s[l-1]

坑点来了。。操作2即区间s(l,n)加上r-a[l],由于我们线段树里的一些标记操作,实际上a[i]和s[i]数组并没有变!

所以我们每次需要用s或a数组的时候都要query。。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<string>
  7. #include<stack>
  8. #include<queue>
  9. #include<deque>
  10. #include<set>
  11. #include<vector>
  12. #include<map>
  13. #include<functional>
  14.  
  15. #define fst first
  16. #define sc second
  17. #define pb push_back
  18. #define mem(a,b) memset(a,b,sizeof(a))
  19. #define lson l,mid,root<<1
  20. #define rson mid+1,r,root<<1|1
  21. #define lc root<<1
  22. #define rc root<<1|1
  23. #define lowbit(x) ((x)&(-x))
  24.  
  25. using namespace std;
  26.  
  27. typedef double db;
  28. typedef long double ldb;
  29. typedef long long ll;
  30. typedef unsigned long long ull;
  31. typedef pair<int,int> PI;
  32. typedef pair<ll,ll> PLL;
  33.  
  34. const db eps = 1e-;
  35. const int mod = 1e9+;
  36. const int maxn = 1e6+;
  37. const int maxm = 2e6+;
  38. const int inf = 0x3f3f3f3f;
  39. const db pi = acos(-1.0);
  40. ll sum[maxn<<];
  41. ll s[maxn];
  42. ll a[maxn];
  43. int ii;
  44. void build(int l, int r, int root){
  45. int mid = l + ((r - l) >> );//位运算TMD优先级!
  46. if(l == r){
  47. sum[root] = s[l];
  48. return;
  49. }
  50. build(lson);
  51. build(rson);
  52. sum[root] = sum[lc]+sum[rc];
  53. }
  54.  
  55. ll addv[maxn << ];
  56. //将root的信息传到左右节点上
  57. void pushup(int root){
  58. sum[root] = sum[lc] + sum[rc];
  59. return;
  60. }
  61. void pushdown(int l, int r, int root){
  62. if(addv[root]){
  63. addv[lc] += addv[root];
  64. addv[rc] += addv[root];
  65. int mid = l + ((r-l)>>);
  66. sum[lc] += addv[root]*(mid-l+);
  67. sum[rc] += addv[root]*(r-mid);
  68. addv[root] = ;
  69. }
  70. return;
  71. }
  72. void update(int ql, int qr, ll add, int l, int r, int root){
  73. if(ql <= l && qr >= r){
  74. addv[root] += add;
  75. sum[root] += add*(r-l+);
  76. return;
  77. }
  78. pushdown(l, r, root);
  79. int mid = l + ((r-l)>>);
  80. if(ql <= mid) update(ql, qr, add, lson);
  81. if(qr > mid) update(ql, qr, add, rson);
  82. pushup(root);
  83. return;
  84. }
  85. ll query(int ql, int qr, int l, int r, int root){
  86. if(ql==)return ;
  87. if(ql <= l && qr >= r) return sum[root];//(sum[root]-(ll)((ll)r-l+1)*s[ii-1]);
  88. pushdown(l, r, root);
  89. int mid = l + ((r-l)>>);
  90. ll ans = ;
  91. if(ql <= mid) ans += query(ql, qr, lson);
  92. if(qr > mid) ans += query(ql, qr, rson);
  93. return ans;
  94. }
  95. int main() {
  96. int n, q;
  97. scanf("%d %d", &n, &q);
  98. for(int i =; i <= n ; i++){
  99. scanf("%lld", &a[i]);
  100. }s[] = ;
  101. mem(s, );
  102. for(int i = ; i <= n; i++){
  103. s[i] = a[i]+s[i-];
  104. }
  105. mem(addv, );
  106. mem(sum, );
  107. build(, n, );
  108. while(q--){
  109. int c,l,r;
  110. scanf("%d %d %d", &c, &l, &r);
  111. if(c==){
  112. ii = l;
  113. printf("%lld\n", query(l, r, , n, ) -(r-l+)*query(l-,l-,,n,));
  114. }
  115. else if(c==){
  116. ll tmp = (ll)r-(query(l, l, , n, ) -query(l-, l-, , n, ));
  117. update(l, n, tmp, , n, );
  118. }A
  119. }
  120. return ;
  121. }
  122. /*
  123. 5 10
  124. 1000000000 1000000000 1000000000 1000000000 1000000000
  125. 1 2 4
  126. 2 1 0
  127. 1 2 4
  128. */

2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)的更多相关文章

  1. 2018徐州网络赛H. Ryuji doesn't want to study

    题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1], ...

  2. ACM-ICPC 2018 徐州赛区网络预赛H Ryuji doesn't want to study(树状数组)题解

    题意:给你数组a,有两个操作 1 l r,计算l到r的答案:a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r] (L is the length of [ l, r ] that ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study(树状数组)

    Output For each question, output one line with one integer represent the answer. 样例输入 5 3 1 2 3 4 5 ...

  4. 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]

    题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study (线段树)

    Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, ea ...

  6. 南昌网络赛 I. Max answer (单调栈 + 线段树)

    https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...

  7. ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study

    死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

    262144K   Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 H Ryuji doesn't want to study (树状数组差分)

    https://nanti.jisuanke.com/t/31460 题意 两个操作.1:查询区间[l,r]的和,设长度为L=r-l+1, sum=a[l]*L+a[l+1]*(L-1)+...+a[ ...

随机推荐

  1. 写 Java 这么久了,来编译个 JDK 玩玩儿吧

    你每天写的 Java 代码都需要 JDK 的支持,都要跑在 JVM 上,难道你就不好奇 JDK 长什么样子吗.好奇,就来编译并实现一个自己的 JDK 吧. 本次编译环境 macOS 10.12,编译的 ...

  2. 从头学pytorch(十六):VGG NET

    VGG AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路. VGG做到了这一点,提出了可以通过重复使⽤ ...

  3. 客户端进行定位(无地图API)

    需求: 根据用户浏览的所在城市加载相应的县级列表 思路: 使用搜索的服务找出当前用户的IP,然后使用百度的服务通过IP进行定位 源码: <!DOCTYPE html> <html&g ...

  4. Tarjan强连通分量模板

    最好还是看一看下面这个网址吧 我的这篇博客里的代码更加缜密(毫无错误的神级代码)https://www.cnblogs.com/Tidoblogs/p/11315153.html https://ww ...

  5. SVN打patch,某Java文件提示svn:mime-type = application/octet-stream的问题

    在使用SVN合版本时发现某文件有冲突,正常冲突文件是可以编辑修改的,但是该文件无法编辑,我只好选择后续修改选项,问题好诡异啊!!!在解决完其他冲突后,我选择了在eclipse开发工具内将修改的代码调整 ...

  6. “Your build settings specify a provisioning profile with the UUID “”, however, no such provisioning profile was found”

    解决方法: 终端命令行输入下面语句,删除所有的Profilescd ~/Library/MobileDevice/Provisioning\ Profiles/rm *.mobileprovision

  7. 认识一下 RabbitMQ

    分布式系统中,如何在各个应用之间高效的进行通信,是系统设计中的一个关键. 使用 消息代理(message broker) 是一个优雅的解决方案. RabbitMQ 就是一个被广泛应用的消息代理,遵循 ...

  8. [3.0] 一个人开发一个App,小程序从0到1,删减添加

    在这个黄道吉日,咱们将要干一件,惊天地泣鬼神,妇孺皆知的大事,那就是删掉微信开发工具自动生成的源代码. 删掉pages下的index.logs目录,啥都不留: 删掉utils下的util.js,只流空 ...

  9. BigInteger的权限设计

    通过储存菜单权限的一个字段(id自定义也是可以的) 1 将选中菜单树的id转换成字符数组的形式, 进行BigInteger对权限进行2的权的和计算 public static BigInteger s ...

  10. 将jar包安装到本地仓库

    通过cmd切换到apache maven 的bin目录 mvn install:install-file -DgroupId=com.antgroup.zmxy -DartifactId=zmxy-s ...