zoukankan      html  css  js  c++  java
  • 洛谷线段树1、2

    传送门

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #define re register
    #define lson (o << 1) 
    #define rson (o << 1 | 1)
    #define mid ( (l + r) >> 1 )
    using namespace std;
    
    inline long long read(){
    	char ch = getchar();
    	long long f = 1 , x = 0;
    	while(ch > '9' || ch < '0') {if(ch == '-') f = -1;ch = getchar();}
    	while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0' ; ch = getchar();}
    	return x * f;
    }
    
    long long n,m,flag,x,y,k;
    long long a[100005];
    
    struct Tree{
    	long long sum , add;
    }t[400040];
    
    inline void pushup(long long o) {
    	t[o].sum = t[lson].sum + t[rson].sum ;
    }
    
    inline void build(long long o , long long l , long long r) {
    	if(l == r) {
    		t[o].sum = a[l];
    	  	return ;
    	}
    	build(lson , l , mid);
    	build(rson , mid + 1 , r);
    	pushup(o);
    }
    
    inline void pushdown(long long o , long long l , long long r) {
    	if(t[o].add != 0) {
    		t[lson].sum += t[o].add * (mid - l + 1) ;
    		t[rson].sum += t[o].add * (r - mid ) ;
    		t[lson].add += t[o].add;
    		t[rson].add += t[o].add;
    		t[o].add = 0;
    	}
    }
    
    inline void add(long long o , long long l , long long r , long long from , long long to , long long v) {
    	if(from <= l && to >= r){
    		t[o].add += v ;
    		t[o].sum += v * (r - l + 1) ;
    		return ;
    	}
    	pushdown(o , l , r);
    	if(from <= mid) add(lson , l , mid , from , to , v);
    	if(to > mid)  add(rson , mid + 1 , r , from , to , v);
    	pushup(o);
    }
    
    inline long long ask_sum(long long o , long long l ,long long r , long long from, long long to){
    	if(from <= l && to >= r)  return t[o].sum;
    	long long ans = 0 ;
    	pushdown(o , l , r) ;
    	if(from <= mid)  ans += ask_sum(lson , l , mid , from , to);
     	if(to > mid)  ans += ask_sum(rson , mid + 1 , r , from , to);
    	return ans;
    }
    
    int main(){
    	n = read(); m = read();
    	for(re int i = 1 ; i <= n ; ++i) {
    		a[i] = read();
    	}
    	build(1 , 1 , n);
    	for(re int i = 1 ; i <= m ; ++i) {
    		flag = read();
    		if(flag == 1) {
    			x = read(); y = read(); k = read();
    			add(1 , 1 , n , x , y , k);
    		}
    		if(flag == 2) {
    			x = read(); y = read();
    			long long ans = ask_sum(1 , 1 , n , x , y) ;
    			printf("%lld
    ",ans);
    		}
    	}
    	return 0;
    }
    

    传送门

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define re register
    #define lson ( o << 1) 
    #define rson (o << 1 | 1)
    #define mid ((l + r) >> 1)
    using namespace std;
    
    inline long long read() {
    	char ch = getchar();
    	long long f = 1 , x = 0;
    	while(ch > '9' || ch < '0') {if(ch == '-') f = -1 ;ch = getchar();}
    	while(ch >= '0' && ch <= '9') {x = (x << 1) + ( x << 3) + ch - '0';ch = getchar();}
    	return x * f;
    }
    
    long long n,m,p,flag,x,y,k;
    long long a[100005];
    
    struct Tree{
    	long long add , mul , sum ;
    }t[400040];
    
    inline void pushup(long long o){
    	t[o].sum = t[lson].sum + t[rson].sum; 
    }
    
    inline void build(long long o , long long l , long long r) {
    	t[o].mul = 1 ; t[o].add = 0 ;
    	if(l == r) {
    		t[o].sum = a[l];
    		t[o].mul = 1;
    		return ;
    	}
    	build(lson , l , mid);
    	build(rson , mid + 1 , r);
    	pushup(o);
    }
    
    inline void pushdown(long long o , long long l , long long r){
    	if(t[o].mul != 1) {
    		t[lson].mul = (t[o].mul * t[lson].mul) % p;
    		t[rson].mul = (t[o].mul * t[rson].mul) % p;
    		t[lson].sum = (t[o].mul * t[lson].sum) % p;
    		t[rson].sum = (t[o].mul * t[rson].sum) % p;
    		t[lson].add = (t[o].mul * t[lson].add) % p;
    		t[rson].add = (t[o].mul * t[rson].add) % p;
    		t[o].mul = 1;
    	}
    	if(t[o].add) {
    		t[lson].sum = (t[lson].sum + (t[o].add * (mid - l + 1)) % p) % p;
    		t[rson].sum = (t[rson].sum + (t[o].add * (r - mid)) % p) % p;
    		t[lson].add = (t[lson].add + t[o].add) % p;
    		t[rson].add = (t[rson].add + t[o].add) % p;
    		t[o].add = 0;
    	}
    }
    
    inline void mul(long long o , long long l , long long r , long long from , long long to , long long v){
    	if(from <= l && to >= r) {
    		t[o].mul = t[o].mul * v % p ;
    		t[o].add = t[o].add * v % p ;
    		t[o].sum = t[o].sum * v % p ;
    		return ;
    	}
    	pushdown(o , l , r);
    	if(from <= mid)  mul(lson , l , mid , from , to , v);
    	if(to > mid)  mul(rson , mid + 1 , r , from , to , v) ;
    	pushup(o);
    }
    
    inline void add(long long o , long long l , long long r , long long from ,long long to , long long v){
    	if(from <= l && to >= r) {
    		t[o].add = (t[o].add + v) % p;
    		t[o].sum = (t[o].sum + v * (r - l + 1) ) % p;
    		return ;
    	}
    	pushdown(o , l , r) ;
    	if(from <= mid)  add(lson , l , mid , from , to , v);
    	if(to > mid)  add(rson , mid + 1 , r , from , to , v);
    	pushup(o);
    }
    
    inline long long query(long long o , long long l , long long r, long long from , long long to){
    	if(from <= l && to >= r) return t[o].sum;
    	long long ans = 0;
    	pushdown(o , l , r) ;
    	if(from <= mid)  ans = (ans + query(lson , l , mid , from , to) ) % p;
    	if(to > mid)  ans = (ans + query(rson , mid + 1 , r , from , to) ) % p;
    	return ans % p;
    }
    
    int main(){
    	n = read(); m = read() ; p = read();
    	for(re int i = 1 ; i <= n ; ++i) 
    		a[i] = read();
    	build(1 , 1 , n);
    	for(re int i = 1 ; i <= m ; ++i) {
    		flag = read();
    		if(flag == 1) {
    			x = read(); y = read(); k = read();
    			mul(1 , 1 , n , x , y , k);
    		}
    		if(flag == 2){
    			x = read(); y = read(); k = read();
    			add(1 , 1 , n , x , y , k);
    		}
    		if(flag == 3) {
    			x = read(); y = read();
    			printf("%lld
    " , query(1 , 1 , n , x , y) );
    		}
    	}
    	return 0 ;
    }
    
  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/Stephen-F/p/9933051.html
Copyright © 2011-2022 走看看