首页 > 代码库 > hiho1080(多标记线段树)

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\n",query(1,x+1,1,x+1,1));
84         }
85     }
86     return 0;
87 }
Others

 

hiho1080(多标记线段树)