3 条题解

  • 0
    @ 2025-10-8 17:02:26
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    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);
        int m;scanf("%d", &m);
        while(m--)
        {
            int l;scanf("%d", &l);
            if(l>maxlen){puts("Impossible");continue;}
            for(int i=1, j=1, pre=0;i<=l;i++)
    		{
                for(;j<=n;j++)if(f[j]>=l-i+1 && a[j]>pre )break;
                printf("%d ", b[pre=a[j++]]);
            }
            printf("\n");
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:02:13
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e5+5;
      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);
          int m;scanf("%d",&m);
          while(m--)
          {
              int l;scanf("%d",&l);
              if(l>maxlen){puts("Impossible");continue;}
              for(int i=1,j=1,pre=0;i<=l;i++)
      		{
                  for(;j<=n;j++)if(f[j]>=l-i+1 && a[j]>pre )break;
                  printf("%d ",b[pre=a[j++]]);
              }
              printf("\n");
          }
          return 0;
      }
      • 1

      *【树状数组+模拟】[HAOI2007] 上升序列(数据加强版)

      信息

      ID
      2699
      时间
      1000ms
      内存
      125MiB
      难度
      6
      标签
      递交数
      61
      已通过
      18
      上传者