• [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
    ", st.query(++u, ++v, 1, n, 1).len);
    118             }
    119         }
    120     }
    121     return 0;
    122 }
    View Code
  • 相关阅读:
    数据分析优化之惩罚性线性回归算法
    数据分析之贝叶斯算法案例
    SSM-CRUD练习
    使用 Code First 迁移以设定数据库种子
    .Net Web Api相关学习内容
    ASP.NET MVC5的学习知识点
    Entity Framework的学习(ASP.NET MVC5的学习中的一部分)
    EFCore框架的学习
    jsp中的<%%>用法
    nginx出现404和403错误
  • 原文地址:https://www.cnblogs.com/jklongint/p/4418997.html
Copyright © 2020-2023  润新知