2 条题解

  • 0
    @ 2025-10-8 16:51:10
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 10;
    int n, a[N], bn, b[N], f[N], c[N];
    
    void upd(int x, int k) {
        for (; x >= 1; x -= x & -x) {
            c[x] = max(c[x], k);
        }
    }
    
    int ask(int x) {
        int res = 0;
        for (; x <= bn; x += x & -x) {
            res = max(res, c[x]);
        }
        return res;
    }
    
    int main() {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            b[i] = a[i];
        }
        sort(b + 1, b + n + 1);
        bn = unique(b + 1, b + n + 1) - b - 1;
        for (int i = 1; i <= n; i++) {
            a[i] = lower_bound(b + 1, b + bn + 1, a[i]) - b;
        }
        memset(c, 0, sizeof(c));
        for (int i = n; i >= 1; i--) {
            f[i] = ask(a[i] + 1) + 1;
            upd(a[i], f[i]);
        }
        int maxlen = ask(1);
        printf("%d\n", maxlen);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:01
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e5+10;
      int n,a[N],bn,b[N],f[N],c[N];
      void upd(int x,int k){for(;x>=1;x-=x&-x)c[x]=max(c[x],k);}
      int ask(int x)
      {
          int res=0;
          for(;x<=bn;x+=x&-x)res=max(res,c[x]);
          return res;
      }
      int main()
      {
          scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
          sort(b+1,b+n+1);
          bn=unique(b+1,b+n+1)-b-1;
          for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+bn+1,a[i])-b;
          memset(c,0,sizeof(c));
          for(int i=n;i>=1;i--)
      	{
              f[i]=ask(a[i]+1)+1;
              upd(a[i],f[i]);
          }
          int maxlen=ask(1);
          printf("%d\n",maxlen);
          return 0;
      }
      • 1

      *【树状数组+离散化】最长上升子序列加强版[scy](好题)

      信息

      ID
      519
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      23
      已通过
      9
      上传者