• hiho1080(多标记线段树)


    题目链接:hiho1080

    直接看代码吧,两个标记分开处理

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 #define mod 1000000007
     5 #define pi (4*atan(1.0))
     6 const int N=1e5+10,M=1e6+10,inf=1e9+10;
     7 ll sum[N*4],lazy[N*4],flag[N*4];
     8 void pushdown(ll pos,ll len)
     9 {
    10     ll lson=pos*2;
    11     ll rson=pos*2+1;
    12     if(flag[pos])
    13     {
    14         lazy[lson]=0;
    15         lazy[rson]=0;
    16         flag[lson]=flag[pos];
    17         flag[rson]=flag[pos];
    18         sum[lson]=(len-(len>>1))*flag[pos];
    19         sum[rson]=(len>>1)*flag[pos];
    20         flag[pos]=0;
    21     }
    22     if(lazy[pos])
    23     {
    24         lazy[lson]+=lazy[pos];
    25         lazy[rson]+=lazy[pos];
    26         sum[lson]+=(len-(len>>1))*lazy[pos];
    27         sum[rson]+=(len>>1)*lazy[pos];
    28         lazy[pos]=0;
    29     }
    30 }
    31 void buildtree(ll l,ll r,ll pos)
    32 {
    33     lazy[pos]=0;
    34     flag[pos]=0;
    35     ll mid=(l+r)>>1;
    36     if(l==r)
    37     {
    38         scanf("%lld",&sum[pos]);
    39         return;
    40     }
    41     buildtree(l,mid,pos*2);
    42     buildtree(mid+1,r,pos*2+1);
    43     sum[pos]=sum[pos*2]+sum[pos*2+1];
    44 }
    45 ll query(ll L,ll R,ll l,ll r,ll pos)
    46 {
    47     pushdown(pos,r-l+1);
    48     if(L<=l&&r<=R)
    49     return sum[pos];
    50     ll mid=(l+r)>>1;
    51     ll ans=0;
    52     if(L<=mid) ans+=query(L,R,l,mid,pos*2);
    53     if(mid<R)  ans+=query(L,R,mid+1,r,pos*2+1);
    54     return ans;
    55 }
    56 void update(ll L,ll R,ll c,ll l,ll r,ll pos,ll gg)
    57 {
    58     pushdown(pos,(r-l+1));
    59     if(L<=l&&r<=R)
    60     {
    61         if(gg)
    62         flag[pos]=c,sum[pos]=(c*(r-l+1));
    63         else
    64         lazy[pos]+=c,sum[pos]+=(c*(r-l+1));
    65         return;
    66     }
    67     ll mid=(l+r)>>1;
    68     if(L<=mid)update(L,R,c,l,mid,pos*2,gg);
    69     if(mid<R)update(L,R,c,mid+1,r,pos*2+1,gg);
    70     sum[pos]=sum[pos*2]+sum[pos*2+1];
    71 }
    72 int main()
    73 {
    74     ll x,y,z,i,t;
    75     while(~scanf("%lld%lld",&x,&y))
    76     {
    77         buildtree(1,x+1,1);
    78         for(i=0;i<y;i++)
    79         {
    80             ll hh,l,r,change;
    81             scanf("%lld%lld%lld%lld",&hh,&l,&r,&change);
    82             update(l+1,r+1,change,1,x+1,1,hh);
    83             printf("%lld
    ",query(1,x+1,1,x+1,1));
    84         }
    85     }
    86     return 0;
    87 }
    Others
  • 相关阅读:
    个人项目:Java实现WC
    第六篇Scrum冲刺博客
    java实现小学生四则运算
    实现wc部分功能 java
    WordCount作业修改
    我的过去、现在和未来
    WordCount
    Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
    《《《在同一台服务器上配置多个Tomcat
    关于Android 5.x的低功耗蓝牙BLE开发简介
  • 原文地址:https://www.cnblogs.com/yijiull/p/6933417.html
Copyright © 2020-2023  润新知