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 - 1057 秋实大哥与花 线段树

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

跟着卿学姐写线段树。。。 ( 秋实大哥与花 UESTC - 1057)

秋实大哥与花 UESTC - 1057 秋实大哥是一个儒雅之人,昼听笙歌夜醉眠,若非月下即花前。 所以秋实大哥精心照料了很多花朵。现在所有的花朵排成了一行,每朵花有一个愉悦值。 秋实大哥每...
  • zhaiqiming2010
  • zhaiqiming2010
  • 2017年04月01日 10:52
  • 367

线段树详解(单点更新与成段更新\区间更新操作)

本文纯属原创,转载请注明出处,谢谢。 距离第一次接触线段树已经一年多了,再次参加ACM暑假集训,这一次轮到我们这些老家伙们给学弟学妹们讲解线段树了,所以就自己重新把自己做过的题目看了一遍,然后写篇博客...
  • u014705673
  • u014705673
  • 2015年07月06日 15:57
  • 6525

线段树之区间更新

线段树之区间更新    线段树系列上一篇文章讲了基础的线段树的建树,单点更新,区间查询。那这篇文章主要讲线段树的区间更新,也就是延迟更新。其实延迟更新的本质和单点更新差不多,只不过差别在于单点更新每次...
  • ruangongshi
  • ruangongshi
  • 2015年08月09日 21:57
  • 2341

HDU 3577 Fast Arrangement(线段树功能:区间更新,查询区间的最大覆盖次数)

HDU 3577 Fast Arrangement(线段树功能:区间更新,查询区间的最大覆盖次数)
  • u012860063
  • u012860063
  • 2015年09月01日 10:31
  • 752

线段树 + 区间更新(区间增加v)模板 ---- poj 3468 - Snarl_jsb

A Simple Problem with Integers Time Limit:  5000MS Memory Limit:  131072K Total Submissions:  5979...
  • winycg
  • winycg
  • 2016年03月05日 21:26
  • 621

ACM_线段树模板(区间更新)

#include #include using namespace std;int ans[1000000],n; struct node { int l,r,n; }a[1000000]...
  • changjiale110
  • changjiale110
  • 2017年08月15日 08:21
  • 181

POJ 3468 线段树区间更新求和模板

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Subm...
  • discreeter
  • discreeter
  • 2015年08月04日 20:19
  • 842

hdu 3577(线段树区间更新)

题意:输入一个t,表示有t组测试数据;           接下来一行,输入两个数,k,m,其中k表示这个辆车最多可以坐这么多人,m表示有m次询问能否上车;           每一次询问,输入两个数...
  • hexianhao
  • hexianhao
  • 2016年02月21日 19:49
  • 368

HDU 1156 Color the ball (线段树 区间更新)

HDU 1156 Color the ball (线段树 区间更新)
  • Tc_To_Top
  • Tc_To_Top
  • 2015年11月25日 18:52
  • 593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UESTC 1057 线段树区间更新
举报原因:
原因补充:

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