zoukankan      html  css  js  c++  java
  • 树状数组区间加法区间查

    区间加法就是差分
    区间查询需要维护另外另一个BIT

    [egin{align} &=sum_{i=1}^r a_i \ &=sum_{i=1}^r sum_{j=1}^{i} b_j \ &=sum_{i=1}^r b_i imes (r-i+1) \ &=sum_{i=1}^r b_i imes (r+1) -sum_{i=1}^r b_i imes i end{align} ]

    维护两个BIT,(sum b_i,sum i*b_i)

    #include<bits/stdc++.h>
    #define rep(i,j,k) for(register int i(j);i<=k;++i)
    #define drp(i,j,k) for(register int i(j);i>=k;--i)
    using namespace std;
    #define int long long
    //#define gt getchar
    inline char gt()
    {
    	static char buf[1 << 21], *p1 = buf, *p2 = buf;
    	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
    }
    template <typename T>
    inline void read (T &x)
    {
    	register char ch = gt();
    	x = 0;
    	int w(0);
    	while(!(ch >= '0' && ch <= '9')) w |= ch == '-', ch = gt();
    	while(ch >= '0' && ch <= '9') x = x * 10 + (ch & 15), ch = gt();
    	w ? x = ~(x - 1) : x;
    }
    template <typename T >
    inline void out(T x)
    {
    	if(x < 0) x = -x, putchar('-');
    	char ch[20];
    	int num(0);
    	while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
    	while(num) putchar(ch[num--]);
    	putchar('
    ');
    }
    const int MAX = 1e6 + 79;
    int N, Q;
    int sum1[MAX], a, b,sum2[MAX];
    
    inline int lowbit(int x)
    {
    	return (x & -x);
    }
    
    inline void add(int x, int val)
    {
    	int mul=x;
    	for(; x <= N; x += lowbit(x)) sum1[x] += val,sum2[x]+=val*mul;
    }
    //sum1[i] = D[i]£¬sum2[i] = D[i]*(i); 
    inline int getnum(int x)
    {
    	int res = 0,mul=x;
    	for(; x; x -= lowbit(x)) res += sum1[x]*(mul+1)-sum2[x];
    	return res;
    }
    
    signed main()
    {
    	read(N);
    	read(Q);
    	rep(i, 1, N)
    	{
    		read(a), add(i, a - b);
    		b = a;
    	}
    	int op = 0, x, y, z;
    	rep(i, 1, Q)
    	{
    		read(op);
    		if(op == 1)
    			{
    				read(x);
    				read(y);
    				read(z);
    				add(x, z);
    				add(y + 1, -z);
    			}
    		else
    			{
    				read(x);read(y);
    				out(getnum(y)-getnum(x-1));
    			}
    	}
    	return 0;
    }
    

    本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15168084.html

  • 相关阅读:
    在CentOS7上部署OpenStack 步骤详解
    Linux运维工程师工作手册
    Nginx+Keepalived实现Web服务器负载均衡
    Django Nginx+uwsgi 安装配置
    Docker-搭建Docker Registry
    centos7系统默认防火墙Firewall使用方法
    Shell脚本编写及常见面试题(二)
    Shell脚本编写及常见面试题(一)
    Linux之解决每次git pull/git push都需输入密码设置
    基于thinkphp5的Excel上传
  • 原文地址:https://www.cnblogs.com/QQ2519/p/15168084.html
Copyright © 2011-2022 走看看