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;
    }
    
  • 相关阅读:
    POJ 1161 Walls ( Floyd && 建图 )
    POJ 1252 Euro Efficiency ( 完全背包变形 && 物品重量为负 )
    POJ 3111 K Best ( 二分 )
    2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )
    POJ 2112 Optimal Milking ( 经典最大流 && Floyd && 二分 )
    POJ 3281 Dining ( 最大流 && 建图 )
    POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)
    冲刺第一周第一天
    学习进度条12/3到12/9
    四则运算2
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8597387.html
Copyright © 2011-2022 走看看