zoukankan      html  css  js  c++  java
  • A Simple Problem with Integers (线段树区间更新,区间查询 模板)

       You have N integers, A1, A2, ... , 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 A1, A2, ... , AN. 
    -1000000000 ≤ Ai ≤ 1000000000.
    Each of the next Q lines represents an operation.
    "C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
    "Q a b" means querying the sum of Aa, Aa+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.
    

    线段树的区间更新和区间查询,带lazy标记,是个模板题

    #include <string.h>
    #include <stdio.h>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    //区间更新,区间查询
    #define ll long long
    const int maxn=1e5+10;
    ll sum[maxn<<2],lazy[maxn<<2];
    int N,Q;
    void pushdown(int rt,int l)
    {
    	if (lazy[rt])
    	{
    		lazy[rt<<1]+=lazy[rt];
    		lazy[rt<<1|1]+=lazy[rt];
    		sum[rt<<1]+=lazy[rt]*(l-l/2);
    		sum[rt<<1|1]+=lazy[rt]*(l/2);
    		lazy[rt]=0;
    	}
    }
    void build(int l,int r,int rt)
    {
    	lazy[rt]=0;//
    	if (l==r)
    	{
    		scanf("%lld",&sum[rt]);//
    		//sum[rt]=a[l];
    		return;
    	}
    	int mid=(l+r)/2;
    	build(l,mid,rt*2);
    	build(mid+1,r,rt*2+1);
    	sum[rt]=sum[rt*2]+sum[rt*2+1];
    }
    void update(int L,int R,ll v,int l,int r,int rt)
    {
    	if (L<=l&&r<=R)//
    	{
    		sum[rt]+=v*(r-l+1);//!
    		lazy[rt]+=v;
    		return;
    	}
    	pushdown(rt,r-l+1);//向下更新 
    	int mid=(l+r)/2;
    	if (L<=mid)//!!
    		update(L,R,v,l,mid,rt*2);
    	if (R>mid)//!!
    		update(L,R,v,mid+1,r,rt*2+1);
    	sum[rt]=sum[rt*2]+sum[rt*2+1];
    }
    ll query(int L,int R,int l,int r,int rt)
    {
    	if (L<=l&&r<=R)
    		return sum[rt];
    	pushdown(rt,r-l+1);
    	ll ans=0;
    	int mid=(l+r)/2;
    	if (L<=mid)
    		ans+=query(L,R,l,mid,rt*2);
    	if (R>mid)
    		ans+=query(L,R,mid+1,r,rt*2+1);
    	return ans;
    }
    int main()
    {
    	int i,j;
    	int x,y;
    	ll z;
    	char c[2];
    	while(scanf("%d%d",&N,&Q)!=EOF)
    	{
    		memset(sum,0,sizeof(sum));
    		memset(lazy,0,sizeof(lazy));
    		build(1,N,1);
    		while(Q--)
    		{
    			scanf("%s",c);
    			if (c[0]=='C')
    			{
    				scanf("%d%d%lld",&x,&y,&z);
    				update(x,y,z,1,N,1);
    			}
    			else if(c[0]=='Q')
    			{
    				scanf("%d%d",&x,&y);
    				printf("%lld
    ",query(x,y,1,N,1)); 
    			}
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    python3 使用opencv 画基本图形
    python 打印 九九表
    Python Date 1–Hello world print
    Linux下 Nginx+vsftpd搭建FTP服务器详细步骤
    Linux 开启端口命令
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK Maven异常解决方案
    React Fullpage
    Mint-UI组件 MessageBox为prompt 添加判断条件
    简易搭建本地静态服务器
    Mint-UI Picker 三级联动
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/14322168.html
Copyright © 2011-2022 走看看