题目链接

题意:两种操作:一是指定区间的数全都加上一个数,二是统计指定区间的和

参考斌神的代码

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int Max = ;
const int INF = 0x3f3f3f3f;
typedef long long LL;
struct node
{
int l,r;
LL inc; //记录这个区间所要增加的值
LL sum;
};
node tree[Max * ];
int num[Max + ];
int n,q;
void buildTree(int left, int right, int k)
{
tree[k].inc = ;
tree[k].tag = INF;
tree[k].l = left;
tree[k].r = right;
if(left == right)
{
tree[k].sum = num[left];
return ;
}
int mid = (left + right) / ;
buildTree(left, mid, k * );
buildTree(mid + , right, k * + );
tree[k].sum = tree[k * ].sum + tree[k * + ].sum;
}
void upDate(int left, int right, int k, int add)
{
if(tree[k].l == left && tree[k].r == right)
{
tree[k].inc += add; //仅仅记录一下该区间所要增加的值而已
//tree[k].tag = add;
return;
}
tree[k].sum += (right - left + ) * add; //对于这样的大区间,就要求出sum
int mid = (tree[k].l + tree[k].r) / ;
if(right <= mid)
{
upDate(left, right, k * , add);
}
else if(mid < left)
{
upDate(left, right, k * + , add);
}
else
{
upDate(left, mid, k * , add);
upDate(mid + , right, k * + , add);
}
}
LL Search(int left, int right, int k)
{
if(right < left)
return ;
if(left == tree[k].l && right == tree[k].r)
{
return tree[k].sum + (right - left + ) * tree[k].inc; //原来的和 + 增加的数的和
}
tree[k].sum += (tree[k].r - tree[k].l + ) * tree[k].inc; //跟新sum的值 ,
int mid = (tree[k].l + tree[k].r) / ;
upDate(tree[k].l, mid, k * , tree[k].inc);
upDate(mid + , tree[k].r, k * + , tree[k].inc);
tree[k].inc = ;
if(right <= mid)
{
return Search(left, right, k * );
}
else if(mid < left)
{
return Search(left, right, k * + );
}
else
{
return Search(left, mid, k * ) + Search(mid + , right, k * + );
}
}
int main()
{
scanf("%d%d", &n, &q);
for(int i = ; i <= n; i++)
scanf("%d", &num[i]);
buildTree(, n, );
char opt[];
int a,b,add;
while(q--)
{
scanf("%s", opt);
if(strcmp(opt, "Q") == )
{
scanf("%d%d", &a, &b); printf("%I64d\n", Search(a, b, ));
}
else
{
scanf("%d%d%d", &a, &b, &add);
upDate(a, b, , add);
}
}
return ;
}

最新文章

  1. mac配置java开发环境: jdk1.7 +sdk1.7+maven +tomcat
  2. Android 编程下 Using ViewPager for Screen Slides
  3. 291. Word Pattern II
  4. MVC 小常识
  5. Asp.Net 之 当前上下文中不存在名称&quot; Server &quot;
  6. Android_硬编码设置TextView字体大小
  7. Codeforces 626E Simple Skewness(暴力枚举+二分)
  8. bzoj 3451: Tyvj1953 Normal [fft 点分治 期望]
  9. 基于synchronized实现的阻塞队列
  10. Java并发框架——AQS中断的支持
  11. Python optparser库详解
  12. Neo4j使用
  13. Pycharm 项目无法导入自己写的模块(问题记录贴)
  14. 设计模式总结篇系列:桥接模式(Bridge)
  15. 数字证书的理解以及自建CA机构颁发证书
  16. 转载-YARN的内存和CPU配置
  17. Gym - 101806R :Recipe(分治+斜率优化)
  18. AJAX 简单归纳 -- 前端知识
  19. github上关于iOS的各种开源项目集合(转)
  20. HTTP 头 Connection:close 作用

热门文章

  1. Web端PHP代码函数覆盖率测试解决方案
  2. .Net简单图片系统-简介
  3. Vware Workstation pro 12|虚拟机
  4. 数据库高可用架构(MySQL、Oracle、MongoDB、Redis)
  5. Maven的set.xml标签详解
  6. 单链表C/C++实现
  7. 显示当前用户所拥有的表&amp;当前用户可以访问的所有表&amp;数据库中的所有表&amp;当前用户信息&amp;当前用户所能管理的用户&amp;数据库中所拥有的用户
  8. 转载--web前端35个jQuery小技巧!
  9. Java设计模式(七) 模板模式
  10. Javaweb容器的四种作用域