F - A Simple Problem with Integers

Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

给出了一个序列,你需要处理如下两种询问。

"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。

"Q a b" 询问[a, b]区间中所有值的和。

Input

第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.

第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。

接下来Q行询问,格式如题目描述。

Output

对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。

Sample Input

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4

Sample Output

4
55
9
15

//自己写,又超时了,网上看了别人的才过的,在类里面要增加一个积累量这个数据,这样,增加命令的时候只要将特定区间积累量加起来并且num+总和,不必遍历到每一个叶节点,但是在查询时,还是要释放,因为,可能查的区间,在积累的这个区间只占一部分。

这样节约了时间,好像叫lazy的思想

 #include <stdio.h>
#include <string.h> struct
{
int l;
int r;
double num;
double Inc;
}shu[]; void Init (int left,int right,int k)
{
shu[k].l=left;
shu[k].r=right;
shu[k].Inc=;
if(left==right)
{
scanf("%lf",&shu[k].num);
return;
}
int mid=(left+right)/;
Init(left,mid,*k);
Init(mid+,right,*k+);
shu[k].num=shu[*k].num+shu[*k+].num;
} void insert(int left,int right,double c,int k)
{
if (shu[k].l==left&&shu[k].r==right)//到某个区间
{
shu[k].Inc+=c;
return;
}
shu[k].num+=(right-left+)*c;
int mid=(shu[k].l+shu[k].r)/;
if (right<=mid)
insert(left,right,c,*k);
else if (left>mid)
insert (left,right,c,*k+);
else
{
insert(left,mid,c,*k);
insert(mid+,right,c,*k+);
}
}
double query(int left,int right,int k)
{
if (shu[k].l==left&&shu[k].r==right)//
{ return shu[k].num+(shu[k].r-shu[k].l+)*shu[k].Inc;
}
int mid=(shu[k].l+shu[k].r)/;
if(shu[k].Inc!=)//将这个区间的积累量释放
{
shu[k].num+=(shu[k].r-shu[k].l+)*shu[k].Inc;//自己先加上
insert(shu[k].l,mid,shu[k].Inc,*k);
insert(mid+,shu[k].r,shu[k].Inc,*k+);
shu[k].Inc=;
}
if (left>mid) return query(left,right,*k+);
else if (right<=mid) return query(left,right,*k);
else
return query(left,mid,*k)+query(mid+,right,*k+); } int main()
{
int Q;
int all_p,a,b;
double c;
char comend;
while (scanf("%d%d",&all_p,&Q)!=EOF)
{
Init(,all_p,);
while (Q--)
{
getchar();
scanf("%c",&comend);
scanf("%d%d",&a,&b); if (comend=='Q') printf("%.0lf\n",query(a,b,));
if (comend=='C')
{
scanf("%lf",&c);
insert(a,b,c,);
}
}
}
return ;
}

最新文章

  1. [VijosP1639]机密文件 题解
  2. Uiautomator 2.0之Until类学习小记
  3. 浅谈web语义化
  4. 怎么样修改PHPStorm中文件修改后标签和文件名的颜色与背景色
  5. (C++)窗口置前SetForegroundWindow(pThis-&gt;hwndWindow);
  6. jq窗口类小问题
  7. 扩展 delphi 线程 使之传递参数.
  8. 模板--&gt;中国剩余定理[互质版本]
  9. JSTL配合正则表达式在JSP中的应用
  10. .NET反编译之Reflector基础示例
  11. 【转】jqGrid学习之介绍
  12. 看漫画学Flux
  13. SQL Server Report Server 报表用户权限T-SQL查询
  14. Python学习笔记6函数和代码复用
  15. 基本数据类型的包装类(Interger)
  16. Java反射和注解
  17. Axure chrome 扩展显示已损坏的解决方法
  18. codeforces 586B/C
  19. shell_sctipts: 删除mysql备份到最后7日
  20. Php函数set_include_path()函数详解

热门文章

  1. utf8和utf-8的区别?
  2. Template design pattern application in android
  3. odoo报表条码无法显示解决
  4. Jmeter-接口测试(二)
  5. Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.cache.ehcache.EhCacheRegionFactory] as strategy [org.hibernate.cache.spi.RegionFac
  6. 改变Prompt默认路径,Change Default Visual Studio Command Prompt Location
  7. XX年年终总结---重新飞跃
  8. hiho一下 第四十九周 欧拉路&amp;#183;一
  9. Atitit.研发管理---api版本号策略与版本控制
  10. 83. Remove Duplicates from Sorted List【easy】