思路:区间维护线段树即可,由题意可知我们只需要区间维护cnt[2, 3, 5, 7]个数的最大值即可。
1 #include <cstdio> 2 #include <iostream> 3 #include <cstdio> 4 #include <algorithm> 5 #include <functional> 6 #include <set> 7 #include <vector> 8 #include <queue> 9 #include <cstring> 10 #include <stack> 11 #include <climits> 12 13 using namespace std; 14 15 #define ll long long 16 #define pb push_back 17 #define fi first 18 #define se second 19 20 struct node{ 21 int l, r; 22 int cnt[10]; 23 int lz[10]; 24 //int number; 25 int mid(){ return (l + r) >> 1; } 26 }; 27 28 vector<node > tree; 29 vector<int > inx; 30 31 void fun(int x, vector<int >& vi){ 32 if(x == 2) vi.pb(2); 33 else if(x == 3) vi.pb(3); 34 else if(x == 4) vi.pb(2), vi.pb(2); 35 else if(x == 5) vi.pb(5); 36 else if(x == 6) vi.pb(2), vi.pb(3); 37 else if(x == 7) vi.pb(7); 38 else if(x == 8) vi.pb(2), vi.pb(2), vi.pb(2); 39 else if(x == 9) vi.pb(3), vi.pb(3); 40 else if(x == 10) vi.pb(2), vi.pb(5); 41 } 42 43 void build_tree(int rt, int l, int r){ 44 tree[rt].l = l; 45 tree[rt].r = r; 46 if(l == r){ 47 //cout << l << endl; 48 //tree[rt].number = l; 49 return; 50 } 51 int m = tree[rt].mid(); 52 build_tree(rt << 1, l, m); 53 build_tree(rt << 1 | 1, m + 1, r); 54 } 55 56 void Push_down(int rt){ 57 int lson = rt << 1; 58 int rson = rt << 1 | 1; 59 for(auto x : inx){ 60 if(tree[rt].cnt[x]) 61 tree[lson].cnt[x] += tree[rt].lz[x]; 62 tree[rson].cnt[x] += tree[rt].lz[x]; 63 tree[lson].lz[x] += tree[rt].lz[x]; 64 tree[rson].lz[x] += tree[rt].lz[x]; 65 tree[rt].lz[x] = 0; 66 } 67 } 68 69 void Push_up(int rt){ 70 int lson = rt << 1; 71 int rson = rt << 1 | 1; 72 for(auto x : inx){ 73 tree[rt].cnt[x] = max(tree[lson].cnt[x], tree[rson].cnt[x]); 74 } 75 } 76 77 void update(int rt, int l, int r, vector<int >& vi){ 78 if(tree[rt].l == l && tree[rt].r == r){ 79 //printf("update [%d. %d] ", l, r); 80 for(auto x : vi){ 81 ++tree[rt].cnt[x]; 82 ++tree[rt].lz[x]; 83 } 84 return; 85 } 86 Push_down(rt); 87 int m = tree[rt].mid(); 88 if(m >= r) update(rt << 1, l, r, vi); 89 else if(m < l) update(rt << 1 | 1, l, r, vi); 90 else{ 91 update(rt << 1, l, m, vi); 92 update(rt << 1 | 1, m + 1, r, vi); 93 } 94 Push_up(rt); 95 } 96 97 void query(int rt, int l, int r, int& res){ 98 if(tree[rt].l == l && tree[rt].r == r){ 99 for(auto x : inx){ 100 res = max(res, tree[rt].cnt[x]); 101 } 102 return; 103 } 104 Push_down(rt); 105 int m = tree[rt].mid(); 106 if(m >= r) query(rt << 1, l, r, res); 107 else if(m < l) query(rt << 1 | 1, l, r, res); 108 else{ 109 query(rt << 1, l, m, res); 110 query(rt << 1 | 1, m + 1, r, res); 111 } 112 } 113 114 // void show(int rt, int l, int r){ 115 // //cout << "show" << endl; 116 // //if(l == r) { 117 // for(auto i : inx) 118 // if(tree[rt].cnt[i]) 119 // printf("L = %d R = %d number = %d cnt[%d] = %d ",l, r, tree[rt].number, i, tree[rt].cnt[i]); 120 // //return; 121 // //} 122 // if(l == r) return ; 123 // int m = tree[rt].mid(); 124 // show(rt << 1, l, m); 125 // show(rt << 1 | 1, m + 1, r); 126 // } 127 128 void solve(){ 129 130 int n, q; 131 //cin >> n >> q; 132 scanf("%d%d",&n, &q); 133 inx.pb(2); inx.pb(3); inx.pb(5); inx.pb(7); 134 tree.resize((n << 2) + 10); 135 build_tree(1, 1, n); 136 while(q--){ 137 char op[10]; 138 int a, b, c; 139 scanf("%s", op); 140 //cout << "op == " << op << endl; 141 if(op[1] == 'U'){ 142 //cin >> a >> b >> c; 143 scanf("%d%d%d", &a, &b, &c); 144 vector<int> vi; 145 fun(c, vi); 146 update(1, a, b, vi); 147 }else{ 148 //cin >> a >> b; 149 scanf("%d%d",&a, &b); 150 int cnt = 0; 151 query(1, a, b, cnt); 152 //cout << "ANSWER " << cnt << endl; 153 printf("ANSWER %d ", cnt); 154 } 155 //show(1, 1, n); 156 } 157 } 158 159 int main(){ 160 161 // freopen("C:\Users\admin\Desktop\input.txt", "r", stdin); 162 // freopen("C:\Users\admin\Desktop\output.txt", "w", stdout); 163 // ios::sync_with_stdio(false); 164 // cin.tie(0); 165 // cout.tie(0); 166 solve(); 167 168 return 0; 169 }