Description

You have N integers, A1A2, ... , 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 A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.

Each of the next Q lines represents an operation.

"C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.

"Q a b" means querying the sum of AaAa+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.

这题是线段树成段更新,看别人代码想了很久。
思路:开一个结构体,含有左右边界l,r,这段区间线段总和sum,更新标志ans(整段区间内每个数要加的数值)。
每次一个区间更新(即加一个数value)的时候,从第一个线线段开始向下判断,如果更新的区间刚好是这条线段的区间,那么直接加上更新的数值value并返回,否则整段区间的sum值变为sum+(b-a+1)*value,再在子节点中找直到找到区间大小加好符合的时候,ans=ans+value,返回。
每一次询问,从第一个线段开始向下,如果区间刚好符合,那么返回区间的sum否则把这条线段的更新标志往子节点传,同时这条线段的更新标志变为0.这里我采用的是每一次更新就把每根点段的总和都保存在sum中,这样询问的时候就不用麻烦的加上b[i].ans*(b[i].r-b[i].l+1).


#include<stdio.h>
#include<string.h>
#define maxn 100005
#define ll long long
char str[10];
ll a[maxn];
struct node
{
ll l,r,sum,ans;
}b[4*maxn]; void build(ll l,ll r,ll i)
{
ll mid;
b[i].l=l;
b[i].r=r;
b[i].ans=0;
if(b[i].l==b[i].r)
{
b[i].sum=a[l];
return;
}
mid=(l+r)/2;
build(l,mid,2*i);
build(mid+1,r,i*2+1);
b[i].sum=b[i*2].sum+b[i*2+1].sum;
} void pushdown(int i)
{
if(b[i].ans){
b[i*2].ans+=b[i].ans;
b[i*2+1].ans+=b[i].ans;
b[i*2].sum+=b[i].ans*(b[i*2].r-b[i*2].l+1);
b[i*2+1].sum+=b[i].ans*(b[i*2+1].r-b[i*2+1].l+1);
b[i].ans=0;
}
} void add(ll l,ll r,ll value,ll i)
{
ll mid;
if(b[i].l==l && b[i].r==r)
{
b[i].ans=b[i].ans+value;
b[i].sum+=(b[i].r-b[i].l+1)*value;
return;
}
pushdown(i);
b[i].sum+=(r-l+1)*value; //这一句写了,下面第二句就不用写了,是同一个意思
mid=(b[i].l+b[i].r)/2;
if(l>mid)
add(l,r,value,i*2+1);
else if(r<=mid)
add(l,r,value,i*2);
else
{
add(l,mid,value,i*2);
add(mid+1,r,value,i*2+1);
}
//b[i].sum=b[i*2].sum+b[i*2+1].sum; ---2
} ll question(ll l,ll r,ll i)
{
ll mid;
if(b[i].l==l && b[i].r==r)
{
return b[i].sum;
}
pushdown(i);
mid=(b[i].l+b[i].r)/2;
if(l>mid)
return question(l,r,i*2+1);
else if(r<=mid)
return question(l,r,i*2);
else if(l<=mid && r>mid)
return question(l,mid,i*2)+question(mid+1,r,i*2+1); } int main()
{
ll n,m,c,d,e,i,j;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
while(m--)
{
scanf("%s",str);
if(str[0]=='Q')
{
scanf("%lld%lld",&c,&d);
printf("%lld\n",question(c,d,1));
}
else if(str[0]=='C')
{
scanf("%lld%lld%lld",&c,&d,&e);
add(c,d,e,1);
}
}
}
return 0;
}


poj 3468A Simple Problem with Integers的更多相关文章

  1. Poj 3468-A Simple Problem with Integers 线段树,树状数组

    题目:http://poj.org/problem?id=3468   A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

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

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

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

    You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of op ...

  4. POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新

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

  5. 3468-A Simple Problem with Integers 线段树(区间增减,区间求和)

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

  6. POJ A Simple Problem with Integers | 线段树基础练习

    #include<cstdio> #include<algorithm> #include<cstring> typedef long long ll; #defi ...

  7. POJ 3468_A Simple Problem with Integers(树状数组)

    完全不知道该怎么用,看书稍微懂了点. 题意: 给定序列及操作,求区间和. 分析: 树状数组可以高效的求出连续一段元素之和或更新单个元素的值.但是无法高效的给某一个区间的所有元素同时加个值. 不能直接用 ...

  8. POJ 3468_A Simple Problem with Integers(线段树)

    题意: 给定序列及操作,求区间和. 分析: 线段树,每个节点维护两个数据: 该区间每个元素所加的值 该区间元素和 可以分为"路过"该区间和"完全覆盖"该区间考虑 ...

  9. poj 3468:A Simple Problem with Integers(线段树,区间修改求和)

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

随机推荐

  1. Linux 使用命令行上传下载文件

    基本语法: 服务器: 用户名@ip:/路径 scp 要拷贝的文件 要存放的文件 上传文件到服务器 # 把本地 source.md 文件上传到 152.116.113.13 服务器的/home目录 # ...

  2. 【Linux】saltstack 安装及简单使用

    准备三台server,一台为master(10.96.20.113),另两台为minion(10.96.20.117,10.96.20.118) 主机名(master.minion1.minion2) ...

  3. os-Bytes环境变量劫持

    信息收集 netdiscovery -i eth0 nmap -sV -sC 192.168.43.74 -oA os-Bytes gobuster -u 192.168.43.74 -w /usr/ ...

  4. 【linux】系统编程-7-网络编程

    目录 前言 10. 网络编程 10.1 简要网络知识 10.2 IP协议 10.2.1 IP地址编址 10.2.2 特殊IP地址 10.2.1 首限广播地址 10.2.2 直接广播地址 10.2.3 ...

  5. 入门OJ:简单的网络游戏

    题目描述 在某款极具技术含量的网络游戏中,佳佳靠着他的聪明智慧垄断了游戏中的油田系统.油田里有许多油井,这些油井排成一个M*N的矩形.每个油井都有一个固定的采油量.每两个相邻的油井之间有一条公路,这些 ...

  6. 关于java并发场景下,HttpServletRequst中session丢失问题

    使用场景: 在list数据进来之后使用安全数组    Lists.newCopyOnWriteArrayList() 进行了   parallelStream  并行处理,在接口中进行了登录者信息接口 ...

  7. python多线程和GIL全局解释器锁

    1.线程     线程被称为轻量级进程,是最小执行单元,系统调度的单位.线程切换需要的资源一般,效率一般.  2.多线程         在单个程序中同时运行多个线程完成不同的工作,称为多线程 3.并 ...

  8. (01)-Python3之--字符串操作

    1.字符串切片取值 字符串的取值通过索引来读取,从0开始. 取区间值如下:字符串变量名[起始索引:结束索引].包含起始,但不包含结束.例如: str_my = "hello,python!我 ...

  9. jQuery 点击input框标题收起

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」

    Compose 简介 | Docker 从入门到实践 https://vuepress.mirror.docker-practice.com/compose/introduction.html Com ...