线段树 区间加

#include<iostream>
#include<queue>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
int n,Q;
long long ans;
long long sum[4000009];
int dx[4000009];
int a[2000009];
void build(int l,int r,int id)
{
    if(l==r)    {sum[id]=a[l];return;}
    int mid=(l+r)/2;
    build(l,mid,id*2);build(mid+1,r,id*2+1);
    sum[id]=sum[id*2]+sum[id*2+1];
    return;
}
void add(int l,int r,int id,int tl,int tr,int x)
{
    if(tl<=l&&r<=tr)
    {
        dx[id]+=x;
        sum[id]+=(r-l+1)*x;
        return;
    }
    if(tl>r||tr<l)    return;
    if(max(l,tl)<=(min(r,tr)))
        sum[id]+=((min(r,tr))-max(l,tl)+1)*x;
    int mid=(l+r)/2;
    add(l,mid,id*2,tl,tr,x);
    add(mid+1,r,id*2+1,tl,tr,x);
    return ;
}
void set(int l,int r,int id)
{
    int mid=(l+r)/2;
    dx[id*2]+=dx[id];sum[id*2]+=(mid-l+1)*dx[id];
    dx[id*2+1]+=dx[id];sum[id*2+1]+=(r-mid)*dx[id];
    dx[id]=0;
}
long long ask(int l,int r,int id,int tl,int tr)
{
    if(tl<=l&&r<=tr)
        return sum[id];
    if(tr<l||tl>r)    return 0;
    if(dx[id])
        set(l,r,id);
    int mid=(l+r)/2;
    long long ans=0;
    if(tl <= mid)
        ans+=ask(l,mid,id*2,tl,tr);
    if(tr >= mid+1)
        ans+=ask(mid+1,r,id*2+1,tl,tr);
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);
    build(1,n,1);
    scanf("%d",&Q);
    for(int i=1,A,l,r,x;i<=Q;i++)
    {
        scanf("%d",&A);
        if(A==1)
        {
            scanf("%d%d%d",&l,&r,&x);
            add(1,n,1,l,r,x);
        }else
        {
            scanf("%d%d",&l,&r);
            ans=0;
            cout<<ask(1,n,1,l,r)<<endl;
        }
    }
    return 0;
} 
时间: 2024-09-27 21:42:43

线段树 区间加的相关文章

vijos 1659 河蟹王国 线段树区间加、区间查询最大值

河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他的名字叫羊驼.河蟹王国富饶安定,人们和谐相处.有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人.于是,羊驼国王将 他的子民排成了一列(==!!b汗~好长呀).每个人都有一个初始的和谐值.羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选 出的人.而且,在某一时间,区间[L

线段树区间加模板

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define LL long long #define l(x) (x<<1) #define r(x) ((x<<1)|1) using namespace std; struct Tre {

POJ 2777 Count Color (线段树区间更新加查询)

Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem. There is a very long board with length L centimeter, L is a positive integer, so we can evenly d

「模板」 线段树——区间乘 &amp;&amp; 区间加 &amp;&amp; 区间求和

「模板」 线段树--区间乘 && 区间加 && 区间求和 <题目链接> 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long long p; class SegmentTree { private: struct Node { int l,r; long long v,mul,add; Node *c[2]; Node(int l,int r):l(l),r(r),mul(1LL),add(0LL) { c[

HDU 1689 Just a Hook 线段树区间更新求和

点击打开链接 Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18894    Accepted Submission(s): 9483 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible

hdu4521-小明系列问题——小明序列(线段树区间求最值)

题意:求最长上升序列的长度(LIS),但是要求相邻的两个数距离至少为d,数据范围较大,普通dp肯定TLE.线段树搞之就可以了,或者优化后的nlogn的dp. 代码为  线段树解法. 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <ctime> 5 #include <queue> 6 #include <stack> 7 #include <cct

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

题目地址:POJ 3468 打了个篮球回来果然神经有点冲动..无脑的狂交了8次WA..居然是更新的时候把r-l写成了l-r... 这题就是区间更新裸题.区间更新就是加一个lazy标记,延迟标记,只有向下查询的时候才将lazy标记向下更新.其他的均按线段树的来就行. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <math.h> #include <stac

HDU 3308 LCIS(最长连续上升子序列)(线段树区间合并)

题意:给你n个整数,有两种操作,U A B把第A个数变成B,Q A B查询区间[A,B]的最长连续上升序列. 思路:还是查询和更新操作,而且也是询问区间中满足条件的连续最长区间 ,所以是线段树区间合并类型的题,通法是开三棵线段树,一个记录此区间内的LCIS的最长长度,一个记录从左边第一个数开始的LCIS长度,另一个记录从右边最后一个数结尾的LCIS长度.然后试图找到父亲与儿子关系维护的递推关系式就好 本题中的递推关系是: 1. 左儿子最右边的值 < 右儿子最左边的值 lmx = (左儿子的lmx

线段树 区间更新

poj3468 A Simple Problem with Integers ( m - ( m >> 1 ) )这里跪了几发.. - 的优先级大于 >> 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<string> 6 #include<queue> 7 #include