社区讨论

求助42

P1704寻找最优美做题曲线参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lob7wc7g
此快照首次捕获于
2023/10/29 16:36
2 年前
此快照最后确认于
2023/11/02 10:51
2 年前
查看原帖
Wa on 3,4,6,7
CPP
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=114514*10;
int n,k,arr[N],p[N],cnt,f[N],x;
bool flag[N];
int main(){
    scanf("%d%d",&n,&k);
    for(int i=0;i<k;++i){
        scanf("%d",&p[i]);
        --p[i];//下标从0开始
    }
    sort(p,p+k);
    for(int i=0;i<n;++i){
        scanf("%d",&arr[i]);
    }
    for(int i=1;i<k;++i){
        if(arr[p[i]]<=arr[p[i-1]]){//p数组不是单调上升的
            printf("impossible");
            return 0;
        }
    }
    p[k]=n;//最后一个必选
    arr[n]=1e9;
    for(int i=0;i<n;++i){
        if(p[cnt]==i){
            ++cnt;
            continue;
        }
        if(arr[i]<=arr[p[cnt]]||arr[i]>=arr[p[cnt+1]])flag[i]=true;//不遵循p数组的结果要删去
    }
    cnt=0;
    for(int i=0;i<=n;++i){
        if(flag[i])continue;
        if(arr[i]>f[cnt]){
            f[++cnt]=arr[i];
        }else{
            x=lower_bound(f,f+cnt+1,arr[i])-f;
            f[x]=arr[i];
        }
    }
    printf("%d",cnt);
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...