1. 程式人生 > >POJ3468 A Simple Problem with Integers 線段樹

POJ3468 A Simple Problem with Integers 線段樹

Description You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval. Input The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000. The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000. Each of the next Q lines represents an operation. “C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000. “Q a b” means querying the sum of Aa, Aa+1, … , Ab. Output You need to answer all Q commands in order. One answer in a line. Sample Input 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 Sample Output 4 55 9 15 Hint The sums may exceed the range of 32-bit integers.

  • 成段增減,區間求和,線段樹+懶惰標記。
public class Main {
    public static Scanner cin;
    public static long[] sum;
    public static long[] cnt;
    public static void pushUp(int rt){
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    public static void build(int l,int r,int rt){
        if(l==r){
            sum[rt]=cin.nextLong();
            return
; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushUp(rt); } public static void pushDown(int rt,int d){ if(cnt[rt]!=0){ cnt[rt<<1]+=cnt[rt]; cnt[rt<<1|1]+=cnt[rt]; sum[rt<<1
|1]+=cnt[rt]*(d>>1); sum[rt<<1]+=cnt[rt]*(d-(d>>1)); cnt[rt]=0; } } public static void update(int L,int R,int p,int l,int r,int rt){ if(L<=l&&r<=R){ sum[rt]+=(long)p*(r-l+1); cnt[rt]+=p; return; } pushDown(rt,r-l+1); int mid=(l+r)>>1; if(L<=mid){ update(L,R,p,l,mid,rt<<1); } if(R>mid){ update(L,R,p,mid+1,r,rt<<1|1); } pushUp(rt); } public static long query(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R){ return sum[rt]; } pushDown(rt,r-l+1); long ans=0; int mid=(l+r)>>1; if(L<=mid){ ans+=query(L,R,l,mid,rt<<1); } if(R>mid){ ans+=query(L,R,mid+1,r,rt<<1|1); } return ans; } public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { cin=new Scanner(new InputStreamReader(System.in)); //cin=new Scanner(InputUtil.cin()); int n,q; n=cin.nextInt(); q=cin.nextInt(); sum=new long[n<<2]; cnt=new long[n<<2]; build(1,n,1); for(int i=0;i<q;++i){ String op=cin.next(); if(op.charAt(0)=='Q'){ int a=cin.nextInt(); int b=cin.nextInt(); System.out.println(query(a,b,1,n,1)); }else{ int a=cin.nextInt(); int b=cin.nextInt(); int c=cin.nextInt(); update(a,b,c,1,n,1); } } } }