zoukankan      html  css  js  c++  java
  • 树状数组

    单点修改,区间查询

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #define ll long long
    using namespace std;
    const int MAXN = 500005;
    ll init() {
    	ll rv = 0, fh = 1;
    	char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') fh = -1;
    		c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		rv = (rv<<1) + (rv<<3) + c - '0';
    		c = getchar();
    	}
    	return fh * rv;
    }
    int n, m, c[MAXN];
    ll lowbit(const ll & x){
    	return x & -x;
    }
    ll query(ll x) {
    	ll ans = 0;
    	for( ; x; x -= lowbit(x)) ans += c[x];
    	return ans;
    }
    void add(ll x, ll y) {
    	for( ; x <= n; x += lowbit(x)) c[x] += y;
    }
    int main() {
    	n = init(); m = init();
    	for(int i = 1; i <= n; i++) {
    		ll a = init();
    		add(i, a);
    	}
    	for(int i = 1; i <= m; i++) {
    		ll t = init(), a = init(), b = init();
    		if(t == 1ll) add(a, b) ;
    		else {
    			printf("%lld
    ", query(b) - query(a -1));
    		}
    	}
    	return 0;
    }
    

    区间修改,单点查询(差分)

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #define ll long long
    using namespace std;
    const int MAXN = 500005;
    ll init() {
    	ll rv = 0, fh = 1;
    	char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') fh = -1;
    		c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		rv = (rv<<1) + (rv<<3) + c - '0';
    		c = getchar();
    	}
    	return fh * rv;
    }
    ll n, m, c[MAXN];
    ll lowbit(const ll &x) {
    	return x & -x;
    }
    ll query(ll x) {
    	ll ans = 0;
    	for( ; x; x -= lowbit(x)) ans += c[x];
    	return ans;
    }
    void add(ll x, ll y) {
    	for( ; x <= n; x += lowbit(x)) c[x] += y;
    }
    int main() {
    	n = init(); m = init();
    	for(int i = 1; i <= n; i++) {
    		ll t = init();
    		add(i, t); add(i + 1, -t);
    	}
    	for(int i = 1; i <= m; i++) {
    		ll t = init();
    		if(t == 1){
    			ll a = init(), b = init(), k = init();
    			add(a, k); add(b + 1, -k);
    		}else {
    			ll x = init();
    			printf("%lld
    ", query(x));
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    BZOJ 4886 Lydsy1705月赛 叠塔游戏
    BZOJ 4552 TJOI2016&&HEOI2016 排序
    BZOJ 3702 二叉树
    BZOJ 4756 Usaco2017 Jan Promotion Counting
    BZOJ 4842 Neerc2016 Delight for a Cat
    BZOJ 1283 序列
    BZOJ 4819 SDOI2017 新生舞会
    BZOJ 1531 POI2005 Bank notes
    BZOJ 1925 SDOI2010 地精部落
    BZOJ WC2006 水管局长数据加强版
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8597387.html
Copyright © 2011-2022 走看看