zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    DUILib的代码分析
    source$表坏块
    树莓派风扇自动控制随想
    给qq机器人加上bing搜索
    龙芯fedora28日常生存指南
    攻防世界 when_did_you_born
    部署PWN题Docker环境
    NPUCTF2020 EzRSA
    金融密码杯 The Art of War
    Machine Learning & Deep Learning Fundamentals
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6860077.html
Copyright © 2011-2022 走看看