八のその他の問題のトレーニング

https://www.luogu.org/problem/P2215

一見すると、タイトルではなく、その最長の上昇シーケンスそれ?

しかし、我々は知っているnlogn上昇状態で定義された最も長いシーケンスI [i]とFはエンディングを表すのを...

質問は必要と私で始まる年代

そのため、後方最長のシーケンス減少しない唯一のレコード長(F、などが重要なの解決には、思考逆

しかし、私は私がしてきたことがわかりWA

WAコード:

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define ri register int
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=10005; 
int n,m,maxx;
int dp[maxn],C[maxn],a[maxn],t[maxn],xx[maxn];
il void add(int x,int p){while(x)C[x]=max(C[x],p),x-=lowbit(x);return;}
il int query(int x){int res=0;while(x<=n)res=max(res,C[x]),x+=lowbit(x);return res;}
int main(){
    scanf("%d",&n);
    for(ri i=1;i<=n;i++)scanf("%d",&a[i]),t[i]=xx[i]=a[i];
    sort(t+1,t+1+n);int sz=unique(t+1,t+1+n)-t-1;
    for(ri i=1;i<=n;i++)a[i]=lower_bound(t+1,t+1+n,a[i])-t;
    for(ri i=n;i>=1;i--){
    dp[i]=query(a[i]+1)+1;
    add(a[i],dp[i]);
    maxx=max(maxx,dp[i]);
    }
    scanf("%d",&m);
    while(m--){int x;scanf("%d",&x);
    if(x>maxx){printf("Impossible\n");continue;}
    for(ri i=1;i<=n;i++){
        if(!x){cout<<endl;break;} 
        if(dp[i]==x)printf("%d ",xx[i]),x--;
    }
    }
    return 0;
}

なぜ?私はあまりにも弱いだから。

会うことができない出力最長の上昇、私は唯一の転送長を

AC CODE

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define ri register int
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=10005; 
int n,m,maxx;
int dp[maxn],C[maxn],a[maxn],t[maxn],xx[maxn];
il void add(int x,int p){while(x)C[x]=max(C[x],p),x-=lowbit(x);return;}
il int query(int x){int res=0;while(x<=n)res=max(res,C[x]),x+=lowbit(x);return res;}
int main(){
    scanf("%d",&n);
    for(ri i=1;i<=n;i++)scanf("%d",&a[i]),t[i]=xx[i]=a[i];
    sort(t+1,t+1+n);int sz=unique(t+1,t+1+n)-t-1;
    for(ri i=1;i<=n;i++)a[i]=lower_bound(t+1,t+1+n,a[i])-t;
    for(ri i=n;i>=1;i--){
    dp[i]=query(a[i]+1)+1;
    add(a[i],dp[i]);
    maxx=max(maxx,dp[i]);
    }
    scanf("%d",&m);
    while(m--){int x;scanf("%d",&x);
    if(x>maxx){printf("Impossible\n");continue;}
    int last=0;
    for(ri i=1;i<=n;i++)
        if(dp[i]>=x&&xx[i]>last){
        printf("%d ",xx[i]),x--,last=xx[i];
        if(!x)break;    
        } puts("");
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/wzxbeliever/p/11709082.html