zoukankan      html  css  js  c++  java
  • poj 3468 A Simple Problem with Integers

    可以用树状数组,线段树,分块做。代码是分块

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    int n, m, uu, vv, ww, blc, bel[100005];
    ll sum[100005], tag[100005], a[100005];
    char ss[15];
    ll query(int uu, int vv){
    	int p=bel[uu], q=bel[vv];
    	ll re=0;
    	if(p==q){
    		for(int i=uu; i<=vv; i++)	re += a[i];
    		re += tag[p] * (vv - uu + 1);
    	}
    	else{
    		for(int i=p+1; i<=q-1; i++)	re += sum[i];
    		for(int i=uu; i<=bel[uu]*blc; i++)	re += a[i] + tag[p];
    		for(int i=(bel[vv]-1)*blc+1; i<=vv; i++)	re += a[i] + tag[q];
    	}
    	return re;
    }
    void update(int uu, int vv, int ww){
    	int p=bel[uu], q=bel[vv];
    	if(p==q){
    		for(int i=uu; i<=vv; i++)	a[i] += ww;
    		sum[p] += ww * (vv - uu + 1);
    	}
    	else{
    		for(int i=p+1; i<=q-1; i++){
    			sum[i] += ww * blc;
    			tag[i] += ww;
    		}
    		for(int i=uu; i<=bel[uu]*blc; i++)	a[i] += ww;
    		sum[p] += ww * (bel[uu]*blc - uu + 1);
    		for(int i=(bel[vv]-1)*blc+1; i<=vv; i++)	a[i] += ww;
    		sum[q] += ww * (vv - (bel[vv]-1)*blc);
    	}
    }
    int main(){
    	cin>>n>>m;
    	for(int i=1; i<=n; i++)	scanf("%lld", &a[i]);
    	blc = sqrt(n);
    	for(int i=1; i<=n; i++){
    		bel[i] = (i - 1) / blc + 1;
    		sum[bel[i]] += a[i];
    	}
    	while(m--){
    		scanf("%s", ss);
    		if(ss[0]=='Q'){
    			scanf("%d %d", &uu, &vv);
    			printf("%lld
    ", query(uu, vv));
    		}
    		else{
    			scanf("%d %d %d", &uu, &vv, &ww);
    			update(uu, vv, ww);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    HDU 1950 Bridging signals
    HDU 1025 (LIS+二分) Constructing Roads In JGShining's Kingdom
    HDU 1160 FatMouse's Speed
    HDU 1257 最少拦截系统
    HDU 1574 RP问题
    解同余式ax ≡ c(mod m)
    拓展欧几里得算法及代码实现
    百练 1088 滑雪
    [再做01背包] POJ 3624 Charm Bracelet
    百练 2755 神奇的口袋
  • 原文地址:https://www.cnblogs.com/poorpool/p/8462681.html
Copyright © 2011-2022 走看看