zoukankan      html  css  js  c++  java
  • POJ 3468 A Simple Problem with Integers 线段树 区间更新

      1 #include<iostream>
      2 #include<string>
      3 #include<algorithm>
      4 #include<cstdlib>
      5 #include<cstdio>
      6 #include<set>
      7 #include<map>
      8 #include<vector>
      9 #include<cstring>
     10 #include<stack>
     11 #include<cmath>
     12 #include<queue>
     13 //#include <bits/stdc++.h>
     14 using namespace std;
     15 #define LL long long
     16 const int maxn=100000;
     17 struct node
     18 {
     19     LL sum,val;
     20 }tree[maxn*4];
     21 
     22 void pushup(int rt)
     23 {
     24     tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
     25 }
     26 void pushdown(int rt,int m)
     27 {
     28     if(tree[rt].val)
     29     {
     30         tree[rt<<1].val+=tree[rt].val;
     31         tree[rt<<1|1].val+=tree[rt].val;
     32         tree[rt<<1].sum+=(LL)(m-(m>>1))*tree[rt].val;
     33         tree[rt<<1|1].sum+=(LL)(m>>1)*tree[rt].val;
     34         tree[rt].val=0;
     35     }
     36 }
     37 
     38 void build_tree(int l,int r,int rt)
     39 {
     40     tree[rt].val=0;
     41     if(l==r)
     42     {
     43         scanf("%I64d",&tree[rt].sum);
     44         return ;
     45     }
     46     int m=(l+r)>>1;
     47     build_tree(l,m,rt<<1);
     48     build_tree(m+1,r,rt<<1|1);
     49     pushup(rt);
     50 }
     51 
     52 LL query(int L,int R,int l,int r,int rt)
     53 {
     54     if(L<=l&&r<=R)
     55     {
     56         return tree[rt].sum;
     57     }
     58     int m=(l+r)>>1;
     59     pushdown(rt,r-l+1);
     60     LL ans=0;
     61     if(L<=m)
     62         ans+=query(L,R,l,m,rt<<1);
     63     if(m<R)
     64         ans+=query(L,R,m+1,r,rt<<1|1);
     65     pushup(rt);
     66     return ans;
     67 }
     68 
     69 void update(int L,int R,int add,int l,int r,int rt)
     70 {
     71     if(L<=l&&r<=R)
     72     {
     73         tree[rt].sum+=(LL)add*(r-l+1);
     74         tree[rt].val+=add;
     75         return;
     76     }
     77     pushdown(rt,r-l+1);
     78     int m=(l+r)>>1;
     79     if(L<=m)
     80         update(L,R,add,l,m,rt<<1);
     81     if(R>m)
     82         update(L,R,add,m+1,r,rt<<1|1);
     83     pushup(rt);
     84 }
     85 
     86 int main()
     87 {
     88     int n,a,b,q;
     89     LL c;
     90     while(~scanf("%d%d",&n,&q))
     91     {
     92         build_tree(1,n,1);
     93         char s[3];
     94         while(q--)
     95         {
     96             scanf("%s",s);
     97             if(s[0]=='Q')
     98             {
     99                 cin>>a>>b;
    100                 cout<<query(a,b,1,n,1)<<endl;
    101             }
    102             else if(s[0]=='C')
    103             {
    104                 cin>>a>>b>>c;
    105                 update(a,b,c,1,n,1);
    106             }
    107         }
    108     }
    109     return 0;
    110 }
    View Code
  • 相关阅读:
    集合的代数运算
    集合的代数运算
    poj1639 Picnic Planning,K度限制生成树
    C/C++学习站点资源
    Mustache 使用心得总结
    PostgreSQL服务端监听设置及client连接方法
    【线性规划与网络流24题】汽车加油行驶问题 分层图
    linux系统下信号具体解释2
    【数据结构】栈-数组的实现
    EJB究竟是什么,真的那么神奇吗??
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5202534.html
Copyright © 2011-2022 走看看