zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    进程实际操作篇2
    进程的实际操作篇1
    进程的理论知识
    解决套接字粘包,udp套接字对象的使用和socketserver模块实现并发
    day24-网络知识扫盲,socket的基本使用
    day23-网络编程之互联网基础,tcp/ip协议详细介绍
    day21-多态和多态性,鸭子类型,反射,内置方法,异常处理
    JAVA WEB小测
    JAVA动手动脑
    JAVA课上动手动脑问题2
  • 原文地址:https://www.cnblogs.com/yijiull/p/6933417.html
Copyright © 2011-2022 走看看