首页 > 代码库 > 【HDOJ】3308 LCIS

【HDOJ】3308 LCIS

线段树,题目感觉比较难,看别人思路做的。还得继续练这个专题。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 using namespace std;
  5 
  6 #define MAXN 100005
  7 #define lson l, mid, rt<<1
  8 #define rson mid+1, r, rt<<1|1
  9 
 10 int str[MAXN<<2], lstr[MAXN<<2], rstr[MAXN<<2];
 11 int nums[MAXN];
 12 
 13 inline int mymax(int a, int b) {
 14     return (a>b) ? a:b;
 15 }
 16 
 17 inline int mymin(int a, int b) {
 18     return (a<b) ? a:b;
 19 }
 20 
 21 void PushUP(int l, int r, int rt) {
 22     int mid;
 23 
 24     str[rt] = mymax(str[rt<<1], str[rt<<1|1]);
 25     lstr[rt] = lstr[rt<<1];
 26     rstr[rt] = rstr[rt<<1|1];
 27 
 28     mid = (l+r)>>1;
 29     if (nums[mid] < nums[mid+1]) {
 30         if (lstr[rt] == mid-l+1)
 31             lstr[rt] += lstr[rt<<1|1];
 32         if (rstr[rt] == r-mid)
 33             rstr[rt] += rstr[rt<<1];
 34         str[rt] = mymax(str[rt], lstr[rt<<1|1]+rstr[rt<<1]);
 35     }
 36 }
 37 
 38 void build(int l, int r, int rt) {
 39     int mid;
 40     if (l == r) {
 41         str[rt] = lstr[rt] = rstr[rt] = 1;
 42         return ;
 43     }
 44     mid = (l+r)>>1;
 45     build(lson);
 46     build(rson);
 47     PushUP(l, r, rt);
 48 }
 49 
 50 void update(int x, int c, int l, int r, int rt) {
 51     int mid;
 52     if (l == r) {
 53         nums[x] = c;
 54         return ;
 55     }
 56     mid = (l+r)>>1;
 57     if (x <= mid)
 58         update(x, c, lson);
 59     else
 60         update(x, c, rson);
 61     PushUP(l, r, rt);
 62 }
 63 
 64 int query(int ll, int rr, int l, int r, int rt) {
 65     int mid,  ret = 0;
 66     if (ll<=l && rr>=r)
 67         return str[rt];
 68 
 69     mid = (l+r)>>1;
 70     if (ll <= mid)
 71         ret = mymax(ret, query(ll,rr,lson));
 72     if (rr > mid)
 73         ret = mymax(ret, query(ll,rr,rson));
 74 
 75     if (ll<=mid && mid<rr && nums[mid]<nums[mid+1]) {
 76         ret = mymax(ret, mymin(mid-ll+1,rstr[rt<<1])+mymin(lstr[rt<<1|1],rr-mid));
 77     }
 78 
 79     return ret;
 80 }
 81 
 82 void output(int beg, int end) {
 83     int i;
 84     for (i=beg; i<end; ++i)
 85         printf("\t%d: l=%d,s=%d,w=%d\n", i, lstr[i], rstr[i], str[i]);
 86 }
 87 
 88 int main() {
 89     int case_n, n, m;
 90     int i, x, y;
 91     char cmd[3];
 92 
 93     scanf("%d", &case_n);
 94 
 95     while (case_n--) {
 96         scanf("%d %d", &n, &m);
 97         for (i=0; i<n; ++i)
 98             scanf("%d", &nums[i]);
 99         build(0, n-1, 1);
100         while (m--) {
101             scanf("%s %d %d", cmd, &x, &y);
102             if (cmd[0] == Q) {
103                 printf("%d\n", query(x,y,0,n-1,1));
104             } else {
105                 update(x, y, 0, n-1, 1);
106             }
107             //output(1, 18);
108         }
109     }
110 
111     return 0;
112 }