zoukankan      html  css  js  c++  java
  • hdu 3308 LCIS 线段树

    题目链接

    给出n个数m个询问, 询问有两种, 一种是将第x个数改为y, 一种是询问[x, y]之间最长连续上升序列,  因为是连续的, 所以就是一个简单的区间合并问题。

    用5个数组, 记录一个区间内的最长连续序列, 最长前缀, 最长后缀, 区间左端点的数是几, 右端点的数是几, 合并的时候判断左区间右端点的数是否小于右区间左端点的数。

    还要注意他给出的范围[l, r]是从0开始的, 所以应该+1。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define pb(x) push_back(x)
     4 #define ll long long
     5 #define mk(x, y) make_pair(x, y)
     6 #define lson l, m, rt<<1
     7 #define mem(a) memset(a, 0, sizeof(a))
     8 #define rson m+1, r, rt<<1|1
     9 #define mem1(a) memset(a, -1, sizeof(a))
    10 #define mem2(a) memset(a, 0x3f, sizeof(a))
    11 #define rep(i, a, n) for(int i = a; i<n; i++)
    12 #define ull unsigned long long
    13 typedef pair<int, int> pll;
    14 const double PI = acos(-1.0);
    15 const double eps = 1e-8;
    16 const int mod = 1e9+7;
    17 const int inf = 1061109567;
    18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    19 const int maxn = 1e5+5;
    20 int maxx[maxn<<2], pre_max[maxn<<2], suf_max[maxn<<2], lnum[maxn<<2], rnum[maxn<<2];
    21 void pushUp(int rt, int m) {
    22     maxx[rt] = max(maxx[rt<<1], maxx[rt<<1|1]);
    23     pre_max[rt] = pre_max[rt<<1];
    24     suf_max[rt] = suf_max[rt<<1|1];
    25     lnum[rt] = lnum[rt<<1];
    26     rnum[rt] = rnum[rt<<1|1];
    27     if(rnum[rt<<1]<lnum[rt<<1|1]) {
    28         maxx[rt] = max(maxx[rt], pre_max[rt<<1|1]+suf_max[rt<<1]);
    29         if(pre_max[rt] == (m-(m>>1)))
    30             pre_max[rt] = pre_max[rt]+pre_max[rt<<1|1];
    31         if(suf_max[rt] == (m>>1))
    32             suf_max[rt] = suf_max[rt<<1|1]+suf_max[rt<<1];
    33     }
    34 }
    35 void update(int p, int val, int l, int r, int rt) {
    36     if(l == r) {
    37         lnum[rt] = rnum[rt] = val;
    38         maxx[rt] = pre_max[rt] = suf_max[rt] = 1;
    39         return ;
    40     }
    41     int m = l+r>>1;
    42     if(p<=m)
    43         update(p, val, lson);
    44     else
    45         update(p, val, rson);
    46     pushUp(rt, r-l+1);
    47 }
    48 int query(int L, int R, int l, int r, int rt) {
    49     if(L<=l&&R>=r) {
    50         return maxx[rt];
    51     }
    52     int m = l+r>>1;
    53     int ret1 = 0, ret2 = 0, ret3 = 0;
    54     if(L<=m)
    55         ret1 = query(L, R, lson);
    56     if(R>m)
    57         ret2 = query(L, R, rson);
    58     if(L<=m&&R>m&&lnum[rt<<1|1]>rnum[rt<<1])
    59         ret3 = min(m-L+1, suf_max[rt<<1])+min(R-m, pre_max[rt<<1|1]);
    60     return max(ret1, max(ret2, ret3));
    61 }
    62 void build(int l, int r, int rt) {
    63     if(l == r) {
    64         scanf("%d", &rnum[rt]);
    65         lnum[rt] = rnum[rt];
    66         maxx[rt] = pre_max[rt] = suf_max[rt] = 1;
    67         return ;
    68     }
    69     int m = l+r>>1;
    70     build(lson);
    71     build(rson);
    72     pushUp(rt, r-l+1);
    73 }
    74 int main()
    75 {
    76     int t, n, m, l, r;
    77     cin>>t;
    78     char c[2];
    79     while(t--) {
    80         scanf("%d%d", &n, &m);
    81         build(1, n, 1);
    82         while(m--) {
    83             scanf("%s%d%d", c, &l, &r);
    84             if(c[0] == 'Q') {
    85                 printf("%d
    ", query(l+1, r+1, 1, n, 1));
    86             } else {
    87                 update(l+1, r, 1, n, 1);
    88             }
    89         }
    90     }
    91 }
  • 相关阅读:
    WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
    WCF后续之旅(13): 创建一个简单的WCF SOAP Message拦截、转发工具[上篇]
    Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架
    [原创]WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
    WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
    WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
    谈谈基于SQL Server 的Exception Handling
    Is this a MS EnterLib DAAB BUG or not?
    难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
    WCF中的Binding模型之一: Binding模型简介
  • 原文地址:https://www.cnblogs.com/yohaha/p/5041381.html
Copyright © 2011-2022 走看看