Sequence operation3397

系统 1708 0

http://acm.hdu.edu.cn/showproblem.php?pid=3397

空间要开大点不然就RE。更新比较复杂,在取反时要注意先向下更新。

如这样的数据:

1

10 10
0 0 0 1 1 0 1 0 1 1

2 0 9

2 0 9

4 0 2

1 0 9

2 0 8

4 0 2

      
          1
      
       #include <iostream>


      
          2
      
       #include <cstdio>


      
          3
      
       #include <cstring>


      
          4
      
      
        #define
      
       lson l,mid,i<<1


      
          5
      
      
        #define
      
       rson mid+1,r,i<<1|1


      
          6
      
      
        using
      
      
        namespace
      
      
         std;


      
      
          7
      
      
        const
      
      
        int
      
       Ni = 
      
        100100
      
      
        ;


      
      
          8
      
      
        int
      
      
         n;


      
      
          9
      
      
        struct
      
      
         node {


      
      
         10
      
      
        int
      
      
         sum1,sum0;


      
      
         11
      
      
        int
      
      
         mx1,lm1,rm1;


      
      
         12
      
      
        int
      
      
         mx0,lm0,rm0;


      
      
         13
      
      
        int
      
      
         lnum,rnum;


      
      
         14
      
       }tree[Ni<<
      
        3
      
      
        ];


      
      
         15
      
      
        int
      
       color[Ni<<
      
        3
      
      
        ];


      
      
         16
      
       inline 
      
        void
      
       changes(
      
        int
      
      
         i)


      
      
         17
      
      
        {


      
      
         18
      
      
            swap(tree[i].mx1,tree[i].mx0);


      
      
         19
      
      
            swap(tree[i].sum1,tree[i].sum0);


      
      
         20
      
      
            swap(tree[i].lm1,tree[i].lm0);


      
      
         21
      
      
            swap(tree[i].rm1,tree[i].rm0);


      
      
         22
      
           tree[i].lnum=!
      
        tree[i].lnum;


      
      
         23
      
           tree[i].rnum=!
      
        tree[i].rnum;


      
      
         24
      
      
        }


      
      
         25
      
       inline 
      
        void
      
       pushup(
      
        int
      
       l,
      
        int
      
       r,
      
        int
      
      
         i)


      
      
         26
      
      
        {


      
      
         27
      
           tree[i].mx1=max(tree[i<<
      
        1
      
      ].mx1,tree[i<<
      
        1
      
      |
      
        1
      
      ].mx1);
      
        ///
      
      
        111111
      
      
         28
      
      
        if
      
      (tree[i<<
      
        1
      
      ].rnum==
      
        1
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        1
      
      
        )


      
      
         29
      
      
            {


      
      
         30
      
               tree[i].mx1=max(tree[i].mx1,tree[i<<
      
        1
      
      ].rm1+tree[i<<
      
        1
      
      |
      
        1
      
      
        ].lm1);


      
      
         31
      
      
            }


      
      
         32
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
         33
      
      
        if
      
      (tree[i<<
      
        1
      
      ].mx1==mid-l+
      
        1
      
      &&tree[i<<
      
        1
      
      ].rnum==
      
        1
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        1
      
      
        )


      
      
         34
      
               tree[i].lm1=tree[i<<
      
        1
      
      ].mx1+tree[i<<
      
        1
      
      |
      
        1
      
      
        ].lm1;


      
      
         35
      
      
        else
      
      
         36
      
               tree[i].lm1=tree[i<<
      
        1
      
      
        ].lm1;


      
      
         37
      
      
         38
      
      
        if
      
      (tree[i<<
      
        1
      
      |
      
        1
      
      ].mx1==r-mid&&tree[i<<
      
        1
      
      ].rnum==
      
        1
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        1
      
      
        )


      
      
         39
      
               tree[i].rm1=tree[i<<
      
        1
      
      |
      
        1
      
      ].mx1+tree[i<<
      
        1
      
      
        ].rm1;


      
      
         40
      
      
        else
      
      
         41
      
               tree[i].rm1=tree[i<<
      
        1
      
      |
      
        1
      
      
        ].rm1;


      
      
         42
      
           tree[i].lnum=tree[i<<
      
        1
      
      
        ].lnum;


      
      
         43
      
           tree[i].rnum=tree[i<<
      
        1
      
      |
      
        1
      
      
        ].rnum;


      
      
         44
      
           tree[i].sum1=tree[i<<
      
        1
      
      ].sum1+tree[i<<
      
        1
      
      |
      
        1
      
      
        ].sum1;


      
      
         45
      
      
         46
      
           tree[i].mx0=max(tree[i<<
      
        1
      
      ].mx0,tree[i<<
      
        1
      
      |
      
        1
      
      ].mx0);
      
        ///
      
      
        000000
      
      
         47
      
      
        if
      
      (tree[i<<
      
        1
      
      ].rnum==
      
        0
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        0
      
      
        )


      
      
         48
      
      
            {


      
      
         49
      
               tree[i].mx0=max(tree[i].mx0,tree[i<<
      
        1
      
      ].rm0+tree[i<<
      
        1
      
      |
      
        1
      
      
        ].lm0);


      
      
         50
      
      
            }


      
      
         51
      
           mid=(l+r)>>
      
        1
      
      
        ;


      
      
         52
      
      
        if
      
      (tree[i<<
      
        1
      
      ].mx0==mid-l+
      
        1
      
      &&tree[i<<
      
        1
      
      ].rnum==
      
        0
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        0
      
      
        )


      
      
         53
      
               tree[i].lm0=tree[i<<
      
        1
      
      ].mx0+tree[i<<
      
        1
      
      |
      
        1
      
      
        ].lm0;


      
      
         54
      
      
        else
      
      
         55
      
               tree[i].lm0=tree[i<<
      
        1
      
      
        ].lm0;


      
      
         56
      
      
         57
      
      
        if
      
      (tree[i<<
      
        1
      
      |
      
        1
      
      ].mx0==r-mid&&tree[i<<
      
        1
      
      ].rnum==
      
        0
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        0
      
      
        )


      
      
         58
      
               tree[i].rm0=tree[i<<
      
        1
      
      |
      
        1
      
      ].mx0+tree[i<<
      
        1
      
      
        ].rm0;


      
      
         59
      
      
        else
      
      
         60
      
               tree[i].rm0=tree[i<<
      
        1
      
      |
      
        1
      
      
        ].rm0;


      
      
         61
      
           tree[i].lnum=tree[i<<
      
        1
      
      
        ].lnum;


      
      
         62
      
           tree[i].rnum=tree[i<<
      
        1
      
      |
      
        1
      
      
        ].rnum;


      
      
         63
      
           tree[i].sum0=tree[i<<
      
        1
      
      ].sum0+tree[i<<
      
        1
      
      |
      
        1
      
      
        ].sum0;


      
      
         64
      
      
        }


      
      
         65
      
       inline 
      
        void
      
       pushdown(
      
        int
      
       l,
      
        int
      
       r,
      
        int
      
      
         i)


      
      
         66
      
      
        {


      
      
         67
      
      
        if
      
      (color[i]==-
      
        8
      
      ) 
      
        return
      
      
        ;


      
      
         68
      
      
        if
      
      (color[i]==
      
        1
      
      
        )


      
      
         69
      
      
            {


      
      
         70
      
               color[i<<
      
        1
      
      ]=color[i<<
      
        1
      
      |
      
        1
      
      ]=
      
        1
      
      
        ;


      
      
         71
      
               color[i]=-
      
        8
      
      
        ;


      
      
         72
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
         73
      
               tree[i<<
      
        1
      
      ].mx1=tree[i<<
      
        1
      
      ].sum1=mid-l+
      
        1
      
      
        ;


      
      
         74
      
               tree[i<<
      
        1
      
      ].lm1=tree[i<<
      
        1
      
      ].rm1=mid-l+
      
        1
      
      
        ;


      
      
         75
      
               tree[i<<
      
        1
      
      ].mx0=tree[i<<
      
        1
      
      ].sum0=
      
        0
      
      
        ;


      
      
         76
      
               tree[i<<
      
        1
      
      ].lm0=tree[i<<
      
        1
      
      ].rm0=
      
        0
      
      
        ;


      
      
         77
      
               tree[i<<
      
        1
      
      ].lnum=tree[i<<
      
        1
      
      ].rnum=
      
        1
      
      
        ;


      
      
         78
      
      
         79
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].mx1=tree[i<<
      
        1
      
      |
      
        1
      
      ].sum1=r-
      
        mid;


      
      
         80
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].lm1=tree[i<<
      
        1
      
      |
      
        1
      
      ].rm1=r-
      
        mid;


      
      
         81
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].mx0=tree[i<<
      
        1
      
      |
      
        1
      
      ].sum0=
      
        0
      
      
        ;


      
      
         82
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].lm0=tree[i<<
      
        1
      
      |
      
        1
      
      ].rm0=
      
        0
      
      
        ;


      
      
         83
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum=tree[i<<
      
        1
      
      |
      
        1
      
      ].rnum=
      
        1
      
      
        ;


      
      
         84
      
           }
      
        else
      
      
        if
      
      (color[i]==
      
        0
      
      
        )


      
      
         85
      
      
            {


      
      
         86
      
               color[i<<
      
        1
      
      ]=color[i<<
      
        1
      
      |
      
        1
      
      ]=
      
        0
      
      
        ;


      
      
         87
      
               color[i]=-
      
        8
      
      
        ;


      
      
         88
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
         89
      
               tree[i<<
      
        1
      
      ].mx1=tree[i<<
      
        1
      
      ].sum1=
      
        0
      
      
        ;


      
      
         90
      
               tree[i<<
      
        1
      
      ].lm1=tree[i<<
      
        1
      
      ].rm1=
      
        0
      
      
        ;


      
      
         91
      
               tree[i<<
      
        1
      
      ].mx0=tree[i<<
      
        1
      
      ].sum0=mid-l+
      
        1
      
      
        ;


      
      
         92
      
               tree[i<<
      
        1
      
      ].lm0=tree[i<<
      
        1
      
      ].rm0=mid-l+
      
        1
      
      
        ;


      
      
         93
      
               tree[i<<
      
        1
      
      ].lnum=tree[i<<
      
        1
      
      ].rnum=
      
        0
      
      
        ;


      
      
         94
      
      
         95
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].mx1=tree[i<<
      
        1
      
      |
      
        1
      
      ].sum1=
      
        0
      
      
        ;


      
      
         96
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].lm1=tree[i<<
      
        1
      
      |
      
        1
      
      ].rm1=
      
        0
      
      
        ;


      
      
         97
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].mx0=tree[i<<
      
        1
      
      |
      
        1
      
      ].sum0=r-
      
        mid;


      
      
         98
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].lm0=tree[i<<
      
        1
      
      |
      
        1
      
      ].rm0=r-
      
        mid;


      
      
         99
      
               tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum=tree[i<<
      
        1
      
      |
      
        1
      
      ].rnum=
      
        0
      
      
        ;


      
      
        100
      
           }
      
        else
      
      
        if
      
      (color[i]==
      
        2
      
      
        )


      
      
        101
      
      
            {


      
      
        102
      
      
        if
      
      (l<
      
        r){


      
      
        103
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
        104
      
                   pushdown(l,mid,i<<
      
        1
      
      
        );


      
      
        105
      
                   pushdown(mid+
      
        1
      
      ,r,i<<
      
        1
      
      |
      
        1
      
      
        );


      
      
        106
      
      
                }


      
      
        107
      
               color[i<<
      
        1
      
      ]=color[i<<
      
        1
      
      |
      
        1
      
      ]=
      
        2
      
      
        ;


      
      
        108
      
               color[i]=-
      
        8
      
      
        ;


      
      
        109
      
               changes(i<<
      
        1
      
      
        );


      
      
        110
      
               changes(i<<
      
        1
      
      |
      
        1
      
      
        );


      
      
        111
      
      
            }


      
      
        112
      
      
        }


      
      
        113
      
      
        void
      
       build(
      
        int
      
       l=
      
        1
      
      ,
      
        int
      
       r=n,
      
        int
      
       i=
      
        1
      
      
        )


      
      
        114
      
      
        {


      
      
        115
      
           color[i]=-
      
        8
      
      
        ;


      
      
        116
      
      
        if
      
      (l==
      
        r)


      
      
        117
      
      
            {


      
      
        118
      
      
        int
      
      
         num;


      
      
        119
      
               scanf(
      
        "
      
      
        %d
      
      
        "
      
      ,&
      
        num);


      
      
        120
      
               tree[i].lnum=tree[i].rnum=
      
        num;


      
      
        121
      
      
        122
      
               tree[i].sum1=tree[i].mx1=
      
        num;


      
      
        123
      
               tree[i].lm1=tree[i].rm1=
      
        num;


      
      
        124
      
      
        125
      
               tree[i].sum0=tree[i].mx0=!
      
        num;


      
      
        126
      
               tree[i].lm0=tree[i].rm0=!
      
        num;


      
      
        127
      
      
        return
      
      
        ;


      
      
        128
      
      
            }


      
      
        129
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
        130
      
      
            build(lson);


      
      
        131
      
      
            build(rson);


      
      
        132
      
      
            pushup(l,r,i);


      
      
        133
      
      
        }


      
      
        134
      
      
        int
      
       query(
      
        int
      
       ql,
      
        int
      
       qr,
      
        int
      
       flg,
      
        int
      
       l=
      
        1
      
      ,
      
        int
      
       r=n,
      
        int
      
       i=
      
        1
      
      
        )


      
      
        135
      
      
        {


      
      
        136
      
      
        int
      
       ans=
      
        0
      
      
        ;


      
      
        137
      
      
        if
      
      (flg==
      
        4
      
      
        )


      
      
        138
      
      
            {


      
      
        139
      
      
        int
      
       lsum=
      
        0
      
      ,rsum=
      
        0
      
      
        ;


      
      
        140
      
      
        if
      
      (ql<=l&&r<=qr) 
      
        return
      
      
         tree[i].mx1;


      
      
        141
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
        142
      
      
                pushdown(l,r,i);


      
      
        143
      
      
        if
      
      (tree[i<<
      
        1
      
      ].rnum==
      
        1
      
      &&tree[i<<
      
        1
      
      |
      
        1
      
      ].lnum==
      
        1
      
      
        )


      
      
        144
      
      
                {


      
      
        145
      
      
        int
      
      
         lsum,rsum;


      
      
        146
      
                   lsum=min(mid-ql+
      
        1
      
      ,tree[i<<
      
        1
      
      
        ].rm1);


      
      
        147
      
                   rsum=min(qr-mid,tree[i<<
      
        1
      
      |
      
        1
      
      
        ].lm1);


      
      
        148
      
                   ans=lsum+
      
        rsum;


      
      
        149
      
      
                }


      
      
        150
      
      
        if
      
      (ql<=mid) lsum=
      
        query(ql,qr,flg,lson);


      
      
        151
      
      
        if
      
      (qr>mid) rsum=
      
        query(ql,qr,flg,rson);


      
      
        152
      
               ans=
      
        max(ans,lsum);


      
      
        153
      
               ans=
      
        max(ans,rsum);


      
      
        154
      
      
            }


      
      
        155
      
      
        else
      
      
        156
      
      
            {


      
      
        157
      
      
        if
      
      (ql<=l&&r<=qr) 
      
        return
      
      
         tree[i].sum1;


      
      
        158
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
        159
      
      
                pushdown(l,r,i);


      
      
        160
      
      
        if
      
      (ql<=mid) ans+=
      
        query(ql,qr,flg,lson);


      
      
        161
      
      
        if
      
      (qr>mid) ans+=
      
        query(ql,qr,flg,rson);


      
      
        162
      
      
            }


      
      
        163
      
      
        return
      
      
         ans;


      
      
        164
      
      
        }


      
      
        165
      
      
        void
      
       update(
      
        int
      
       ql,
      
        int
      
       qr,
      
        int
      
       num,
      
        int
      
       l=
      
        1
      
      ,
      
        int
      
       r=n,
      
        int
      
       i=
      
        1
      
      
        )


      
      
        166
      
      
        {


      
      
        167
      
      
        if
      
      (ql<=l&&r<=
      
        qr)


      
      
        168
      
      
            {


      
      
        169
      
      
        if
      
      (num==
      
        1
      
      
        )


      
      
        170
      
      
                {


      
      
        171
      
                   tree[i].mx1=tree[i].sum1=(r-l+
      
        1
      
      
        );


      
      
        172
      
                   tree[i].lm1=tree[i].rm1=(r-l+
      
        1
      
      
        );


      
      
        173
      
      
        174
      
                   tree[i].mx0=tree[i].sum0=
      
        0
      
      
        ;


      
      
        175
      
                   tree[i].lm0=tree[i].rm0=
      
        0
      
      
        ;


      
      
        176
      
      
        177
      
                   tree[i].lnum=tree[i].rnum=
      
        num;


      
      
        178
      
                   color[i]=
      
        num;


      
      
        179
      
      
                }


      
      
        180
      
      
        else
      
      
        if
      
      (num==
      
        0
      
      
        )


      
      
        181
      
      
                {


      
      
        182
      
                   tree[i].mx1=tree[i].sum1=
      
        0
      
      
        ;


      
      
        183
      
                   tree[i].lm1=tree[i].rm1=
      
        0
      
      
        ;


      
      
        184
      
      
        185
      
                   tree[i].mx0=tree[i].sum0=(r-l+
      
        1
      
      
        );


      
      
        186
      
                   tree[i].lm0=tree[i].rm0=(r-l+
      
        1
      
      
        );


      
      
        187
      
      
        188
      
                   tree[i].lnum=tree[i].rnum=
      
        num;


      
      
        189
      
                   color[i]=
      
        num;


      
      
        190
      
      
                }


      
      
        191
      
      
        else
      
      
        if
      
      (num==
      
        2
      
      
        )


      
      
        192
      
      
                {


      
      
        193
      
      
        if
      
      (color[i]==
      
        2
      
      
        )


      
      
        194
      
      
                    {


      
      
        195
      
                       color[i]=-
      
        8
      
      
        ;


      
      
        196
      
      
                    }


      
      
        197
      
      
        else
      
      
        198
      
      
                    {


      
      
        199
      
      
        if
      
      (l<
      
        r)


      
      
        200
      
      
                        pushdown(l,r,i);


      
      
        201
      
                       color[i]=
      
        2
      
      
        ;


      
      
        202
      
      
                    }


      
      
        203
      
      
                    changes(i);


      
      
        204
      
      
                }


      
      
        205
      
      
        return
      
      
        ;


      
      
        206
      
      
            }


      
      
        207
      
      
            pushdown(l,r,i);


      
      
        208
      
      
        int
      
       mid=(l+r)>>
      
        1
      
      
        ;


      
      
        209
      
      
        if
      
      (ql<=
      
        mid) update(ql,qr,num,lson);


      
      
        210
      
      
        if
      
      (qr>
      
        mid) update(ql,qr,num,rson);


      
      
        211
      
      
            pushup(l,r,i);


      
      
        212
      
      
        }


      
      
        213
      
      
        int
      
      
         main()


      
      
        214
      
      
        {


      
      
        215
      
      
        int
      
      
         m,i,t,l,r,f;


      
      
        216
      
           cin>>
      
        t;


      
      
        217
      
      
        while
      
      (t--
      
        )


      
      
        218
      
      
            {


      
      
        219
      
               scanf(
      
        "
      
      
        %d%d
      
      
        "
      
      ,&n,&
      
        m);


      
      
        220
      
      
                build();


      
      
        221
      
      
        for
      
      (i=
      
        0
      
      ;i<m;i++
      
        )


      
      
        222
      
      
                {


      
      
        223
      
                   scanf(
      
        "
      
      
        %d%d%d
      
      
        "
      
      ,&f,&l,&
      
        r);


      
      
        224
      
                   l++;r++
      
        ;


      
      
        225
      
      
        if
      
      (f<
      
        3
      
      
        )


      
      
        226
      
      
                    {


      
      
        227
      
      
                        update(l,r,f);


      
      
        228
      
      
                    }


      
      
        229
      
      
        else
      
      
        230
      
      
                    {


      
      
        231
      
      
        int
      
       ans=
      
        query(l,r,f);


      
      
        232
      
                       printf(
      
        "
      
      
        %d\n
      
      
        "
      
      
        ,ans);


      
      
        233
      
      
                    }


      
      
        234
      
      
                }


      
      
        235
      
      
            }


      
      
        236
      
      
        return
      
      
        0
      
      
        ;


      
      
        237
      
       }
    

 

Sequence operation3397


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论