• 【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("	%d: l=%d,s=%d,w=%d
    ", 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
    ", 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 }
  • 相关阅读:
    Linux_DNS服务器
    Linux_DNS服务器
    Linux_FTP服务器
    Linux_FTP服务器
    Linux_DHCP&DHCP Relay
    分布式内存存储式元数据服务的构建
    如何提高分布式系统的可观察性:Insight Tool的引入
    论分布式系统中Metric框架的设计
    分布式存储系统关于GDPR条例中的数据清除原则
    Pipeline并行处理模型
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3766737.html
Copyright © 2020-2023  润新知