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;
}






















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

相关文章推荐

【UESTC】2015 UESTC Training for Data Structures

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=102504#overview 基本上更新完了,剩下的题1058 1071是不会写...

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

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

杭电饭卡问题

Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额...

【UESTC】2015 UESTC Training for Data Structures

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=102504#overview 基本上更新完了,剩下的题1058 1071是不会写...

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

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

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

题意: 有T(T

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

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

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

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

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

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

UESTC1425-LCIS 线段树区间合并

做过一个类似的,没注意细节,wrong了一次。。。 ACcode: #include #include using namespace std; const int size=100...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UESTC 1057 线段树区间更新
举报原因:
原因补充:

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