zoukankan      html  css  js  c++  java
  • 树状数组成段更新模板

    这个成段的编写复杂度很低,不需要加大空间复杂度,便于处理成段加,询问每个位置的值的操作:

    #include <bits/stdc++.h>
    using namespace std ;
    typedef long long ll ;
    typedef long double ld ;
    typedef unsigned long long ull ;
    #ifdef _WIN32
    #define LLD "%I64d"
    #else
    #define LLD "%lld"
    #endif
    #define pi (acos(-1.0))
    #define F first
    #define S second
    #define lson (o<<1),l,mid
    #define rson (o<<1|1),mid+1,r
    #define MP make_pair
    const double eps = 1e-9 ;
    const int inf = 0x3f3f3f3f ;
    const ll INF = (ll)4e18 ;
    
    const int M = (int)1e5+10 ;
    struct BIT {
    	ll u[M] ;
    	int n ;
    	void clr(int _n) { 
    		n = _n ;
    		memset (u,0,sizeof(int)*(n+1)) ;
    	}
    
    	void add (int x , ll v) {
    		for (; x<=n ; x += x&-x) u[x] += v ;
    	}
    	void add (int l , int r , ll v) {
    		add(l,v) ; add(r+1,-v) ;
    	}
    	ll get (int x , ll ret=0) {
    		for (; x>0 ; x -= x&-x) ret += u[x] ;
    		return ret ;
    	}
    }bit ;
    
    int main () {
    	int a[20] = {0,3,7,4,8,9,11,5,4,9,1} ;
    	for (int i=1 ; i<=10 ; i++) printf ("%-4d" , a[i]) ; puts ("");
    
    	bit.clr (10) ;
    	for (int i=10 ; i>0 ; i--) {
    		a[i] = a[i]-a[i-1] ;
    		bit.add(i,i,a[i]) ;
    	}
    	for (int i=1 ; i<=10 ; i++) printf ("%-4d",a[i]) ; puts ("");
    	for (int i=1 ; i<=10 ; i++) printf ("%-4d" , bit.u[i]) ; puts ("") ;
    	int Q ;
    	scanf ("%d" , &Q) ;
    	while (Q --) {
    		int x ;
    		scanf ("%d" , &x) ;
    		printf ("%d
    " , bit.get(x) ) ;
    	}
    	return 0 ;
    }
    

      

  • 相关阅读:
    序列化限流排序
    linux常用命令
    Django路径问题
    asp.net 后台 修改 javascript 变量
    支持 IE8 IE11 和 FF, Chrome 浏览器的圆角
    Asp.net Response.Redirect with post data
    gridview 字段没有绑定由于column visible= false
    聪明的小技巧
    GridView
    各种集合
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/5438755.html
Copyright © 2011-2022 走看看