UESTC 1057 线段树区间更新

原创 2015年11月18日 23:57:31







秋实大哥与花

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前。

所以秋实大哥精心照料了很多花朵。现在所有的花朵排成了一行,每朵花有一个愉悦值。

秋实大哥每天要对着某一段连续的花朵歌唱,然后这些花朵的愉悦值都会增加一个相同的值v(v可能为负)。

同时他想知道每次他唱完歌后这一段连续的花朵的愉悦值总和是多少。

Input

第一行有一个整数n,表示花朵的总数目。

第二行包含n个整数ai,表示第i朵花初始的愉悦值。

第三行包含一个整数m,表示秋实大哥唱了m天的歌。

接下来m行,每行包含三个整数l r v,表示秋实大哥对着[l,r]这个区间内的花朵歌唱,每朵花的愉悦值增加了v

1nmai|v|1000001lrn

Output

输出共m行,第i行表示秋实大哥完成第i天的歌唱后,那一段花朵的愉悦值总和。

Sample input and output

Sample Input Sample Output
3
0 0 0
3
1 2 1
1 2 -1
1 3 1
2
0
3

Source

2015 UESTC Training for Data Structures.

线段树区间更新,这一题由于忽略了运算符的优先级而错了很多次,这里有详细的运算符优先级的分类, 对线段树理解更深了,不用模板也能敲出来啦

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
#define LL long long
struct point
{
    int lc,rc;
	LL add;
    LL sum;
}tree[N<<2];
LL sum=0;
void Pushup(int rt)
{
    tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
void pushdown(int rt,int leg)
{
    if(tree[rt].add)
    {
        tree[rt<<1].sum+=tree[rt].add*(leg-(leg>>1));
        tree[rt<<1|1].sum+=tree[rt].add*((leg>>1));
        tree[rt<<1].add+=tree[rt].add;
        tree[rt<<1|1].add+=tree[rt].add;
        tree[rt].add=0;
    }
}
void build(int L,int R,int rt)
{
    tree[rt].lc=L;
    tree[rt].rc=R;
    tree[rt].add=0;
    if(L==R)
    {
        scanf("%lld",&tree[rt].sum);
        return;
    }
    int mid=(L+R)>>1;
    build(L,mid,rt<<1);
    build(mid+1,R,rt<<1|1);
    Pushup(rt);
}
void update(int L,int R,LL c,int rt)
{
    if(tree[rt].lc==L&&tree[rt].rc==R)
    {
        tree[rt].sum+=c*(R-L+1);
        tree[rt].add+=c;
        return;
    }
    pushdown(rt,tree[rt].rc-tree[rt].lc+1);
    int mid=(tree[rt].rc+tree[rt].lc)>>1;
    if(R<=mid)update(L,R,c,rt<<1);
    else if(L>mid)update(L,R,c,rt<<1|1);
    else{
        update(L,mid,c,rt<<1);
        update(mid+1,R,c,rt<<1|1);
    }
    Pushup(rt);
}
void query(int L,int R,int rt)
{
    if(L==tree[rt].lc&&tree[rt].rc==R)
    {
        sum+=tree[rt].sum;
		return ;
    }
    pushdown(rt,tree[rt].rc-tree[rt].lc+1);
    int mid=(tree[rt].lc+tree[rt].rc)>>1;
    if(R<=mid)
	{
		 query(L,R,rt<<1);
	}
    else if(L>mid) 
		query(L,R,rt<<1|1);
    else 
	{ 
		query(L,mid,rt<<1);
		query(mid+1,R,rt<<1|1);
	}
}
int main()
{
#ifdef CDZSC
	freopen("i.txt","r",stdin);
#endif
    int n,m,a,b; LL c;
    while(~scanf("%d",&n))
    {
       build(1,n,1);
       scanf("%d",&m);
       while(m--)
       {
		   sum=0;
           scanf("%d%d%lld",&a,&b,&c);
           update(a,b,c,1);
		   query(a,b,1);
           printf("%lld\n",sum);
       }
    }
    return 0;
}






















版权声明:本文为博主原创文章,你若想转载请附上源博客地址。 举报

相关文章推荐

CDOJ-1057 秋实大哥与花(线段树区间更新)

秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...

UESTC - 1057 秋实大哥与花 线段树

题意 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前。 所以秋实大哥精心照料了很多花朵。现在所有的花朵排成了一行,每朵花有一个愉悦值。 秋实大哥每天要对着某一段连续的花朵歌唱,然后这些花...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

UESTC 94 Bracket Sequence(线段树的区间更新)

题意: 有T(T<10)组测试数据,然后有一个数字N(N<100000),接下来的一行里有N个字符,每个字符是’(‘或’)’,现在有三种操作 (1)”set l r c”,表示将区间[l,r...

UESTC 1546(线段树,成段更新,区间合并)

这个题有一点非常重要,就是任意一个非法的序列,我们在它的左边添加若干个"(",右边添加若干个")",那么一定能够变成一个合法的序列。 在这里就不证明了,比如"()))((",我们在它的左边添加两个"...

【线段树-区间更新求区间和】CDOJ 1057

秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su...

UESTC1425-LCIS 线段树区间合并

做过一个类似的,没注意细节,wrong了一次。。。 ACcode: #include #include using namespace std; const int size=100...

UESTC 1598 加帕里公园的friends 线段树区间合并

题意:单点更新,区间查询最大子区间和。 线段树区间合并 每个节点维护四元组 int sum[4*MAXN], suml[4*MAXN], sumr[4*MAXN], ans[4*MAXN]; sum[...

UESTC 1712 Easy Problem With Numbers (线段树区间修改+非互素逆元)

题意: 输入n个数与q个操作,以及一个数M. 操作有三种形式: 1.将区间[L,R]内的数都乘以一个数x; 2.将区间[L,R]内的数都除以一个数x; 3.询问区间[L,R...

UESTC 1546 线段树 区间合并

相当郁闷啊,初看,题目描述简单,感觉很容易,直接由区间'('数判断,敲出来之后“意外”wrong了,当时就感觉自己2了,怎么会这么想呢。找度娘咨询了一下解题思路,原来还要记录区间左连续最值,有思路了,...

UESTC 1592 An easy problem B 线段树区间合并

题意:区间更新把该区间内所有的数异或1,区间查询该区间内最长连续1的长度。 线段树区间合并 每个节点维护十元组 int summid[4*MAXN][2], suml[4*MAXN][2], sumr...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)