[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 }
View Code

 

posted @ 2015-04-12 06:14  jklongint  阅读(292)  评论(0编辑  收藏  举报