• [luoguP3402] 最长公共子序列(DP + 离散化 + 树状数组)


    传送门

    比 P1439 排列LCS问题,难那么一点点,只不过有的元素不是两个串都有,还有数据范围变大,树状数组得打离散化。

    不过如果用栈+二分的话还是一样的。

    ——代码

     1 #include <cstdio>
     2 #include <algorithm>
     3 
     4 const int MAXN = 300001;
     5 int n, m, size, ans;
     6 int a[MAXN], b[MAXN], c[MAXN << 1], q[MAXN << 1], p[MAXN << 1];
     7 
     8 inline int max(int x, int y)
     9 {
    10     return x > y ? x : y;
    11 }
    12 
    13 inline int query(int x)
    14 {
    15     int sum = 0;
    16     for(; x; x -= x & -x) sum = max(sum, c[x]);
    17     return sum;
    18 }
    19 
    20 inline void update(int x, int d)
    21 {
    22     for(; x <= size; x += x & -x) c[x] = max(c[x], d);
    23 }
    24 
    25 int main()
    26 {
    27     int i, j, x;
    28     scanf("%d %d", &n, &m);
    29     for(i = 1; i <= n; i++) scanf("%d", &a[i]), q[i] = a[i];
    30     for(i = 1; i <= m; i++) scanf("%d", &b[i]), q[i + n] = b[i];
    31     std::sort(q + 1, q + n + m + 1);
    32     size = std::unique(q + 1, q + n + m + 1) - (q + 1);
    33     for(i = 1; i <= n; i++) a[i] = std::lower_bound(q + 1, q + size + 1, a[i]) - q;
    34     for(i = 1; i <= m; i++)
    35     {
    36         b[i] = std::lower_bound(q + 1, q + size + 1, b[i]) - q;
    37         p[b[i]] = i;
    38     }
    39     for(i = 1; i <= n; i++)
    40         if(p[a[i]])
    41         {
    42             x = query(p[a[i]] - 1) + 1;
    43             update(p[a[i]], x);
    44             ans = max(ans, x);
    45         }
    46     printf("%d", ans);
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    Quick Sort 快速排序的原理及实现
    IAR_FOR_STM8开发之DEMO的建立
    跨域或者Internet访问Remoting[Remoting FAQ]
    2020 7 22 每日总结
    2020 7 23 每日总结
    2020 7 27 每日总结
    2020 7 20 每日总结
    2020 7 29 每日总结
    2020 7 21 每日总结
    2020 7 28 每日总结
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6860077.html
Copyright © 2020-2023  润新知