HDU 3397 Sequence operation

Sequence operation

Time Limit: 5000ms
Memory Limit: 32768KB
This problem will be judged on HDU. Original ID: 3397
64-bit integer IO format: %I64d      Java class name: Main
lxhgww got a sequence contains n characters which are all '0's or '1's.
We have five operations here:
Change operations:
0 a b change all characters into '0's in [a , b]
1 a b change all characters into '1's in [a , b]
2 a b change all '0's into '1's and change all '1's into '0's in [a, b]
Output operations:
3 a b output the number of '1's in [a, b]
4 a b output the length of the longest continuous '1' string in [a , b]
 

Input

T(T<=10) in the first line is the case number.
Each case has two integers in the first line: n and m (1 <= n , m <= 100000).
The next line contains n characters, '0' or '1' separated by spaces.
Then m lines are the operations:
op a b: 0 <= op <= 4 , 0 <= a <= b < n.
 

Output

For each output operation , output the result.
 

Sample Input

1
10 10
0 0 0 1 1 0 1 0 1 1
1 0 2
3 0 5
2 2 2
4 0 4
0 3 6
2 3 7
4 2 8
1 0 5
0 5 6
3 3 9

Sample Output

5
2
6
5

Source

 
解题:线段树。。。
 
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int maxn = 100010;
  4 struct node {
  5     int lt,rt,cover;
  6 } tree[maxn<<2];
  7 inline void pushup(int v) {
  8     if(tree[v<<1].cover == tree[v<<1|1].cover)
  9         tree[v].cover = tree[v<<1].cover;
 10     else tree[v].cover = -1;
 11 }
 12 inline void pushdown(int v) {
 13     if(tree[v].cover >= 0) {
 14         tree[v<<1].cover = tree[v<<1|1].cover = tree[v].cover;
 15         tree[v].cover = -1;
 16     }
 17 }
 18 void build(int L,int R,int v) {
 19     tree[v].lt = L;
 20     tree[v].rt = R;
 21     if(L == R) {
 22         scanf("%d",&tree[v].cover);
 23         return;
 24     }
 25     int mid = (L + R)>>1;
 26     build(L,mid,v<<1);
 27     build(mid+1,R,v<<1|1);
 28     pushup(v);
 29 }
 30 void update(int lt,int rt,int val,int v) {
 31     if(tree[v].cover == val) return;
 32     if(lt <= tree[v].lt && rt >= tree[v].rt) {
 33         tree[v].cover = val;
 34         return;
 35     }
 36     pushdown(v);
 37     if(lt <= tree[v<<1].rt) update(lt,rt,val,v<<1);
 38     if(rt >= tree[v<<1|1].lt) update(lt,rt,val,v<<1|1);
 39     pushup(v);
 40 }
 41 void update(int lt,int rt,int v) {
 42     if(lt <= tree[v].lt && rt >= tree[v].rt && tree[v].cover >= 0) {
 43         tree[v].cover ^= 1;
 44         return;
 45     }
 46     pushdown(v);
 47     if(lt <= tree[v<<1].rt) update(lt,rt,v<<1);
 48     if(rt >= tree[v<<1|1].lt) update(lt,rt,v<<1|1);
 49     pushup(v);
 50 }
 51 int ret;
 52 void query(int lt,int rt,int v) {
 53     if(!tree[v].cover) return;
 54     if(lt <= tree[v].lt && rt >= tree[v].rt && tree[v].cover >= 0) {
 55         ret += tree[v].cover?tree[v].rt - tree[v].lt + 1:0;
 56         return;
 57     }
 58     pushdown(v);
 59     if(lt <= tree[v<<1].rt) query(lt,rt,v<<1);
 60     if(rt >= tree[v<<1|1].lt) query(lt,rt,v<<1|1);
 61     pushup(v);
 62 }
 63 void query(int lt,int rt,int &r,int &ans,int v) {
 64     if(!tree[v].cover) return;
 65     if(lt <= tree[v].lt && rt >= tree[v].rt && tree[v].cover >= 0) {
 66         if(tree[v].cover) {
 67             if(r == tree[v].lt - 1) ans += tree[v].rt - tree[v].lt + 1;
 68             else ans = tree[v].rt - tree[v].lt + 1;
 69             r = tree[v].rt;
 70             ret = max(ret,ans);
 71         }
 72         return;
 73     }
 74     pushdown(v);
 75     if(lt <= tree[v<<1].rt) query(lt,rt,r,ans,v<<1);
 76     if(rt >= tree[v<<1|1].lt) query(lt,rt,r,ans,v<<1|1);
 77     pushup(v);
 78 }
 79 int main() {
 80     int T,n,m,op,a,b;
 81     scanf("%d",&T);
 82     while(T--) {
 83         scanf("%d %d",&n,&m);
 84         build(0,n-1,1);
 85         while(m--) {
 86             scanf("%d %d %d",&op,&a,&b);
 87             switch(op) {
 88             case 0:
 89             case 1:
 90                 update(a,b,op,1);
 91                 break;
 92             case 2:
 93                 update(a,b,1);
 94                 break;
 95             case 3:
 96                 ret = 0;
 97                 query(a,b,1);
 98                 printf("%d
",ret);
 99                 break;
100             case 4:int ans = ret = 0,r = -1;
101                 query(a,b,r,ans,1);
102                 printf("%d
",ret);
103                 break;
104             }
105         }
106     }
107     return 0;
108 }
View Code
原文地址:https://www.cnblogs.com/crackpotisback/p/4462705.html