2 条题解

  • 0
    @ 2025-10-8 16:57:45
    #include <bits/stdc++.h>
    #define lowbit(x) (x&-x)
    const int N=1e5+10;
    using namespace std;
    typedef long long ll;
    bool debug1;
    int n;
    ll s[N],a[N],b[N],f[N],ans;
    bool debug2;
    void change(int x,ll k){
        for(int i=x;i<=n;i+=lowbit(i))
            s[i]=max(s[i],k);
    }
    ll query(int x){
        ll t=0;
        for(int i=x;i;i-=lowbit(i))
            t=max(t,s[i]);
        return t;
    }
    int main(){
    //  freopen("data.in","r",stdin);
    //  freopen("my.out","w",stdout);
    //  cout<<((&debug2-&debug1)/1024.0/1024.0)<<endl;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+n+1);
        unique(b+1,b+n+1);
        for(int i=1;i<=n;i++){
            int k=lower_bound(b+1,b+n+1,a[i])-b;
            f[i]=query(k-1)+a[i];
            change(k,f[i]);
        }
        for(int i=1;i<=n;i++)
            ans=max(ans,f[i]);
        printf("%lld",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:57:39
      #include <bits/stdc++.h>
      #define lowbit(x) (x&-x)
      const int N=1e5+10;
      using namespace std;
      typedef long long ll;
      bool debug1;
      int n;
      ll s[N],a[N],b[N],f[N],ans;
      bool debug2;
      void change(int x,ll k){
          for(int i=x;i<=n;i+=lowbit(i))
              s[i]=max(s[i],k);
      }
      ll query(int x){
          ll t=0;
          for(int i=x;i;i-=lowbit(i))
              t=max(t,s[i]);
          return t;
      }
      int main(){
      //  freopen("data.in","r",stdin);
      //  freopen("my.out","w",stdout);
      //  cout<<((&debug2-&debug1)/1024.0/1024.0)<<endl;
          scanf("%d",&n);
          for(int i=1;i<=n;i++){
              scanf("%lld",&a[i]);
              b[i]=a[i];
          }
          sort(b+1,b+n+1);
          unique(b+1,b+n+1);
          for(int i=1;i<=n;i++){
              int k=lower_bound(b+1,b+n+1,a[i])-b;
              f[i]=query(k-1)+a[i];
              change(k,f[i]);
          }
          for(int i=1;i<=n;i++)
              ans=max(ans,f[i]);
          printf("%lld",ans);
          return 0;
      } 
      • 1

      *【树状数组】最大上升子序列和

      信息

      ID
      1535
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      7
      已通过
      3
      上传者