[hdu3308]线段树
题意:单点更新,区间LCIS(最长连续递增序列)查询。具备区间合并维护的性质,不用线段树用什么~
1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <cstring> 8 #include <map> 9 #include <queue> 10 #include <deque> 11 #include <cmath> 12 #include <vector> 13 #include <ctime> 14 #include <cctype> 15 #include <set> 16 17 using namespace std; 18 19 #define mem0(a) memset(a, 0, sizeof(a)) 20 #define lson l, m, rt << 1 21 #define rson m + 1, r, rt << 1 | 1 22 #define define_m int m = (l + r) >> 1 23 #define Rep(a, b) for(int a = 0; a < b; a++) 24 #define lowbit(x) ((x) & (-(x))) 25 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {} 26 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {} 27 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {} 28 29 typedef double db; 30 typedef long long LL; 31 typedef pair<int, int> pii; 32 typedef multiset<int> msi; 33 typedef multiset<int>::iterator msii; 34 typedef set<int> si; 35 typedef set<int>::iterator sii; 36 typedef vector<int> vi; 37 38 const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1}; 39 const int dy[8] = {0, -1, 0, 1, -1, 1, 1, -1}; 40 const int maxn = 1e5 + 7; 41 const int maxm = 1e5 + 7; 42 const int maxv = 1e7 + 7; 43 const int MD = 1e9 +7; 44 const int INF = 1e9 + 7; 45 const double PI = acos(-1.0); 46 const double eps = 1e-10; 47 48 int A[maxn]; 49 50 struct SegTree { 51 struct Node { 52 int suflen, prelen, len; 53 } tree[maxn << 2]; 54 55 Node merge(Node a, Node b, int l, int m, int r) { 56 Node c; 57 int leftLen = m - l + 1, rightLen = r - m; 58 c.prelen = a.prelen; 59 if (c.prelen == leftLen && A[m] < A[m + 1]) c.prelen += b.prelen; 60 c.suflen = b.suflen; 61 if (c.suflen == rightLen && A[m] < A[m + 1]) c.suflen += a.suflen; 62 c.len = a.len; 63 c.len = max(c.len, b.len); 64 if (A[m] < A[m + 1])c.len = max(c.len, a.suflen + b.prelen); 65 return c; 66 } 67 void build(int l, int r, int rt) { 68 if (l == r) { 69 int x; 70 scanf("%d", &x); 71 A[l] = x; 72 tree[rt].len = tree[rt].prelen = tree[rt].suflen = 1; 73 return ; 74 } 75 define_m; 76 build(lson); 77 build(rson); 78 tree[rt] = merge(tree[rt << 1], tree[rt << 1 | 1], l, m, r); 79 } 80 void update(int p, int x, int l, int r, int rt) { 81 if (l == r) { 82 tree[rt].len = tree[rt].prelen = tree[rt].suflen = 1; 83 A[l] = x; 84 return ; 85 } 86 define_m; 87 if (p <= m) update(p, x, lson); 88 else update(p, x, rson); 89 tree[rt] = merge(tree[rt << 1], tree[rt << 1 | 1], l, m, r); 90 } 91 Node query(int L, int R, int l, int r, int rt) { 92 if (L <= l && r <= R) return tree[rt]; 93 define_m; 94 if (R <= m) return query(L, R, lson); 95 if (L > m) return query(L, R, rson); 96 return merge(query(L, m, lson), query(m + 1, R, rson), L, m, R); 97 } 98 }; 99 100 SegTree st; 101 102 int main() { 103 //freopen("in.txt", "r", stdin); 104 int T; 105 cin >> T; 106 while (T--) { 107 int n, m; 108 cin >> n >> m; 109 st.build(1, n, 1); 110 for (int i = 0, u, v; i < m; i++) { 111 char s[3]; 112 scanf("%s%d%d", s, &u, &v); 113 if (s[0] == 'U') { 114 st.update(++u, v, 1, n, 1); 115 } 116 else { 117 printf("%d\n", st.query(++u, ++v, 1, n, 1).len); 118 } 119 } 120 } 121 return 0; 122 }