题意:

给定一个区间, 每个区间有一个初值, 然后给出Q个操作, C a b c是给[a,b]中每个数加上c, Q a b 是查询[a,b]的和

代码:

 #include <cstdio>
#include <cstring>
using namespace std;
const int maxn = + ;
struct{
long long val, addMark;
}segTree[maxn << ];
long long a[maxn];
int n , m;
void build(int root, int l, int r){
segTree[root].addMark = ; if(l == r){
segTree[root].val = a[l];
return;//记得return
}
int mid = (l+r) >> ;
build(root*, l,mid);
build(root*+, mid + , r);
segTree[root].val = segTree[root*].val + segTree[root*+].val; //回溯时候更新root
}
void push_down(int root,int L, int R){//传入L, R是为了计算左右子树的和, 分别是(mid - L + 1)、(R-mid)
if(segTree[root].addMark != ){
int mid = L + R >> ;
segTree[root*].addMark += segTree[root].addMark;
segTree[root*+].addMark += segTree[root].addMark; segTree[root*].val += segTree[root].addMark * (mid - L + );
segTree[root*+].val += segTree[root].addMark * (R-mid); segTree[root].addMark = ;
}
}
long long query(int root, int L, int R, int QL, int QR){
if(L > QR || R < QL) return ; if(QL <= L && QR >= R) {
return segTree[root].val;
}
push_down(root,L,R);//如果要向下计算记得先pushdown
int mid = L + R >> ;
return query(root*,L,mid,QL,QR) + query(root*+,mid+,R,QL,QR);
}
void update(int root, int L ,int R, int QL, int QR, int val){
if(L > QR || R < QL) return; if(QL <= L && QR >= R){ segTree[root].val += val * (R-L+);
segTree[root].addMark += val;
return;
} push_down(root,L,R);//如果要向下计算记得先pushdown
int mid = L + R >> ;
update(root*, L, mid, QL , QR , val);
update(root*+,mid+, R, QL,QR,val);
segTree[root].val = segTree[root*].val + segTree[root*+].val;//回溯更新root
}
int main()
{
// freopen("1.txt","r", stdin);
while(~scanf("%d %d", &n , &m)){
memset(segTree,,sizeof(segTree)); for(int i = ; i <= n; i++){
scanf("%lld", &a[i]);
}
build(,,n);
while(m--){
char cho[];
scanf("%s", cho);
int x, y;
scanf("%d %d", &x, &y);
if(cho[] == 'C'){
int v;
scanf("%d", &v);
update(,,n,x,y,v);
}
else{
printf("%lld\n",query(,,n,x,y));
}
}
}
}

POJ 3468 A Simple Problem with Integers (线段树多点更新模板)的更多相关文章

  1. [POJ] 3468 A Simple Problem with Integers [线段树区间更新求和]

    A Simple Problem with Integers   Description You have N integers, A1, A2, ... , AN. You need to deal ...

  2. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  3. poj 3468 A Simple Problem with Integers 线段树区间更新

    id=3468">点击打开链接题目链接 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072 ...

  4. POJ 3468 A Simple Problem with Integers(线段树,区间更新,区间求和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 67511   ...

  5. (简单) POJ 3468 A Simple Problem with Integers , 线段树+区间更新。

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  6. POJ 3468 A Simple Problem with Integers(线段树区间更新)

    题目地址:POJ 3468 打了个篮球回来果然神经有点冲动. . 无脑的狂交了8次WA..竟然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题. 区间更新就是加一个lazy标记,延迟标记, ...

  7. POJ 3468 A Simple Problem with Integers(线段树区间更新,模板题,求区间和)

    #include <iostream> #include <stdio.h> #include <string.h> #define lson rt<< ...

  8. POJ 3468 A Simple Problem with Integers 线段树 区间更新

    #include<iostream> #include<string> #include<algorithm> #include<cstdlib> #i ...

  9. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

随机推荐

  1. 自己写一个websocket

    import socket, base64, hashlib sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsock ...

  2. Qt样式表之一:Qt样式表和盒子模型介绍

    一.Qt样式表介绍 Qt样式表是一个可以自定义部件外观的十分强大的机制,可以用来美化部件.Qt样式表的概念.术语和语法都受到了HTML的层叠样式表(Cascading Style Sheets, CS ...

  3. The 17th Zhejiang University Programming Contest Sponsored by TuSimple J

    Knuth-Morris-Pratt Algorithm Time Limit: 1 Second      Memory Limit: 65536 KB In computer science, t ...

  4. SPFA/Dijkstra POJ 3159 Candies

    题目传送门 题意:n个人发糖果,B 比 A 多 C的糖果,问最后第n个人比第一个人多多少的糖果 分析:最短路,Dijkstra 优先队列优化可过,SPFA竟然要用栈,队列超时! 代码: /****** ...

  5. 516 Longest Palindromic Subsequence 最长回文子序列

    给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 详见:https://leetcode.com/problems/longest-palindromic-subseque ...

  6. [在读]functional javascript

    讲javascript函数化编程的一本书,逛淘宝正好看到有一家卖英文书的,顺手就买了,目前搁置.

  7. Nagios安装与部署

    Nagios概述: Nagios是一款开源免费(也有收费版的Nagios XI)的监控工具,可以用以监控Windows.Linux.Unix.Router.Switch,可以监控指定主机的物理基础资源 ...

  8. C#结构体和类的区别(转)

    结构体和类的区别:    在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体有啥不同,虽 ...

  9. oracle 函数、聚焦函数

    oracle 常用的函数 以及 聚焦函数 --1,字符函数 --当没有表可以用个的时候oracle自带一个虚表dual -- || 表示连接符号 将字符串连接到一起 式显示 Lower(char):将 ...

  10. AJPFX关于JAVA多线程实现的三种方式

    JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...