14赞
977
当前位置:  开发笔记 > 编程语言 > 正文

POJ3468ASimpleProblemwithIntegers(线段树区间更新,区间查询和)

YouhaveNintegers,A1,A2,,AN.Youneedtodealwithtwokindsofoperations.Onetypeofoperationisto

You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

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

Hint

The sums may exceed the range of 32-bit integers
解题思路:利用懒惰标记更新区间并求区间和
代码如下:
  1 #include
  2 #include
  3 using namespace std;
  4 
  5 const int MAXN = 500005;
  6 int a[MAXN];
  7 long long int tree[MAXN*4];
  8 long long int lazy[MAXN*4];
  9 int N,Q;
 10 string s;
 11 int x , y, z;
 12 void push_down(int l ,int r ,int rt)
 13 {
 14     int m = (l+r)/2;
 15     
 16     if(lazy[rt])
 17     {
 18         tree[rt*2] += lazy[rt]*(m-l+1);
 19         tree[rt*2+1] += lazy[rt]*(r-m);
 20         lazy[rt*2] += lazy[rt];
 21         lazy[rt*2+1] += lazy[rt];
 22         lazy[rt] = 0; 
 23     }
 24 }
 25 void bulid_tree(int l ,int r ,int rt)
 26 {
 27     if(l==r)
 28     {
 29         tree[rt] = a[l];
 30         return ;
 31     }
 32     int m = (l+r)/2;
 33     
 34     bulid_tree(l,m,rt*2);
 35     bulid_tree(m+1,r,rt*2+1);
 36     tree[rt] = tree[rt*2]+tree[rt*2+1];
 37 }
 38 
 39 long long int Query(int x ,int y ,int l ,int r ,int rt)
 40 {
 41     long long sum = 0 ;
 42     if(x<=l&&r<=y)
 43     {
 44         return tree[rt];
 45     }
 46     int m = (l+r)/2;
 47     push_down(l,r,rt);
 48     if(x<=m)
 49     {
 50         sum += Query(x,y,l,m,rt*2);
 51     }
 52     if(m<y)
 53     {
 54         sum += Query(x,y,m+1,r,rt*2+1);
 55     }
 56     return sum;
 57 }
 58 void Update(int x ,int y ,int k ,int l ,int r ,int rt)
 59 {
 60     if(x<=l&&y>=r)
 61     {
 62         tree[rt] += k*(r-l+1);
 63         lazy[rt] += k;
 64         return ;
 65     }
 66     push_down(l,r,rt);
 67     int m = (l+r)/2;
 68     if(x<=m)
 69     {
 70         Update(x,y,k,l,m,rt*2);
 71     }
 72     if(y>m)
 73     {
 74         Update(x,y,k,m+1,r,rt*2+1);
 75     }
 76     tree[rt] = tree[rt*2]+tree[rt*2+1];
 77 }
 78 int main()
 79 {
 80     scanf("%d%d",&N,&Q);
 81     for(int i = 1 ; i <= N;i++)
 82     {
 83         scanf("%d",&a[i]);
 84     }
 85     bulid_tree(1,N,1);
 86     while(Q--)
 87     {
 88         cin>>s;
 89         if(s[0]==Q)
 90         {
 91             scanf("%d%d",&x,&y);
 92             printf("%lld\n",Query(x,y,1,N,1));
 93             
 94         }
 95         else
 96         if(s[0]==C)
 97         {
 98             scanf("%d%d%d",&x,&y,&z);
 99             Update(x,y,z,1,N,1);
100         }
101     }
102     return 0;
103 }

POJ - 3468A Simple Problem with Integers (线段树区间更新,区间查询和)


推荐阅读
  • 1.遍历map的几种方式:privateHashtableemailsnewHashtable();方法一:用entry ... [详细]
  • 第一章:1.时间估算。2.“抽签”优化3.AntsPoj1852的思考过程第二章:1.next_permutation函数2.栈内存和堆内存——关于内存抽象。 *3.BestCow ... [详细]
  • ContactsAcore进程,在内存较少和开机进程过多的情况下会常常被ActivityManagerKill掉。导致Sim卡联系人开机后未导入或者仅仅导入一部分,造成联系人丢失的 ... [详细]
  • 08动作系统(二)使用即时动作
    前一篇文章大致理解了动作系统的结构,今天先学习一个简单的即时动作如何使用。首先使用配置好的环境创建一个项目DemoActionInstant命令:python create_pr ... [详细]
  • Appium是移动端的自动化测试工具,类似于前面提到的Selenium。利用Appium可以驱动Android、iOS等移动设备完成自动化测试,例如模拟点击、滑动、输入等操作。不过 ... [详细]
  • 点此看题面大致题意:给你一张无向连通图,其中每条边的边权为这条边连接的两点的权值之差。每次询问两点之间是否存在两条不重复的路径,若存在则输出这两条路径上最大值的最小值。大致思路这题 ... [详细]
  • 函数一、函数是什么定义:函数是指一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需要调用函数名即可。C中的函数叫function,java中的函数叫method, ... [详细]
  • 比赛题解部分题目较难阴阳链归去来兮何由征手写堆三角形魔板较难搜索Aeasyproblem矩阵快速幂方程Fly字符串异或和规律自己打表可发 ... [详细]
  • ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 24. Logging
    常用的诊断中间件:UseDeveloperExceptionPageUseStatusCodePages:返回400~600的状态码UseExceptionHandler自定义异常 ... [详细]
  • 转载请注明出处:王亟亟的大牛之路5号的时候把自己的老版工具类贴了出来,然后今天上午又加了一点内容进去,然后也是简单的几个Button跑下,看看效果。 新增了两个类,一个手机信息类, ... [详细]
  • http:s-macke.github.iojor1kdemosmain.html?userMP10ocGujo&cpuasm&n1&relayURLwss%3A%2F%2Frel ... [详细]
  • 一、新建工程 具体安装和新建工程的方法在cocos2dx目录下的README.md文件中已经有详细说明,这里只做简单介绍。 1、上官网下载cocos2dx-3.0的源码,http: ... [详细]
  • 近期分享干货,使用python实现语音文件的特征提取方法
    python编程语言无疑是人工智能最重要的语言之一,但是其中语音识别是当前人工智能比较热门的方向,百度的小度机器人、阿里的天猫精灵等其他各大公司都推出了各自的语音助手机器人,其识别 ... [详细]
  • 快速搭建LAMP环境
    快速搭建LAMP环境Linux+Apache+MySQL+PHP一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度 ... [详细]
  • Windows、Linux、ARM、Android、iOS全平台支持的RTMP推流组件EasyRTMPiOS如何接入软编码?
    视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率、减小带宽使用、提升画面质量,成为音视频开发者努力的重点。随着互联网、流媒体技术的发展,兼容支持H.264、H.26 ... [详细]
author-avatar
为谁落慕
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有