zoukankan      html  css  js  c++  java
  • POJ A Simple Problem with Integers | 线段树基础练习

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 typedef long long ll;
     5 #define N 100010
     6 using namespace std;
     7 struct node
     8 {
     9     ll l,r,lz,sum;
    10 }t[4*N];
    11 ll read()
    12 {
    13     ll ret=0,neg=1;
    14     char j=getchar();
    15     for (;j>'9' || j<'0';j=getchar())
    16     if (j=='-') neg=-1;
    17     for (;j<='9' && j>='0';j=getchar())
    18     ret=ret*10+j-'0';
    19     return ret*neg;
    20 }
    21 ll n,q,a[N],l,r,k;
    22 void pushup(ll p)
    23 {
    24     t[p].sum=t[2*p].sum+t[2*p+1].sum;
    25 }
    26 void pushdown(ll p)
    27 {
    28     if (t[p].l==t[p].r || t[p].lz==0) return;
    29     ll tmp=t[p].lz,mid=(t[p].r+t[p].l)>>1;
    30     t[2*p].sum+=(mid-t[p].l+1)*tmp;
    31     t[2*p+1].sum+=(t[p].r-mid)*tmp;
    32     t[2*p].lz+=tmp;
    33     t[2*p+1].lz+=tmp;
    34     t[p].lz=0;
    35 }
    36 void build(ll p,ll l,ll r)
    37 {
    38     t[p].l=l,t[p].r=r;
    39     if (l!=r)
    40     {
    41     ll mid=l+r>>1;
    42     build(2*p,l,mid);
    43     build(2*p+1,mid+1,r);
    44     pushup(p);
    45     }
    46     else
    47     t[p].sum=a[l];
    48 }
    49 void modify(ll p,ll l,ll r,ll k)
    50 {
    51     ll L=t[p].l,R=t[p].r,mid=(L+R)>>1;
    52     if (l==L && r==R)
    53     {
    54     t[p].sum+=(r-l+1)*k;
    55     t[p].lz+=k;
    56     return ;
    57     }
    58     pushdown(p);
    59     if (r<=mid)
    60     modify(2*p,l,r,k);
    61     else if (l>mid)
    62     modify(2*p+1,l,r,k);
    63     else modify(2*p,l,mid,k),modify(2*p+1,mid+1,r,k);
    64     pushup(p);
    65 }
    66 ll query(ll p,ll l,ll r)
    67 {
    68     ll L=t[p].l,R=t[p].r,mid=(L+R)>>1;
    69     if (l==L && r==R)
    70     return t[p].sum;
    71     pushdown(p);
    72     if (r<=mid)
    73     return query(2*p,l,r);
    74     if (l>mid) return query(2*p+1,l,r);
    75     return query(2*p,l,mid)+query(2*p+1,mid+1,r);
    76 }
    77 char op[N];
    78 int main()
    79 {
    80     n=read(),q=read();
    81     for (int i=1;i<=n;i++)
    82     a[i]=read();
    83     build(1,1,n);
    84     while (q--)
    85     {
    86     scanf("%s",op);
    87     if (op[0]=='Q')
    88         l=read(),r=read(),printf("%lld
    ",query(1,l,r));
    89     else l=read(),r=read(),k=read(),modify(1,l,r,k);
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    2015 Multi-University Training Contest 5 1007
    2015 Multi-University Training Contest 5 1002
    ZOJ 3261 Connections in Galaxy War (并查集)
    POJ 2492 A Bug's Life (并查集)
    POJ 1733 Parity game (离散化+带权并查集)
    HDU 3172 Virtual Friends (并查集节点统计)
    HDU 2473 Junk-Mail Filter (并查集节点删除)
    hdu3047 Zjnu Stadium && HDU 3038 How Many Answers Are Wrong (带权并查集)
    HDU 1272 小希的迷宫
    poj 3620 Avoid The Lakes(dfs)
  • 原文地址:https://www.cnblogs.com/mrsheep/p/7866372.html
Copyright © 2011-2022 走看看