2 条题解

  • 2
    @ 2025-3-5 21:35:04

    太好的解法了!! 希望大家看一下

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    int f[200005];
    int a[200005];
    int g[200005];
    int find(int l,int r,int num)
    {
    	while(r-l>1)
    	{
    		int mid=(l+r)/2;
    		if(g[mid]>=num) r=mid;
    		else l=mid;
    	}
    	return r;
    }
    int main()
    {
    	freopen("listwo.in","r",stdin);
    	freopen("listwo.out","w",stdout);
    	
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    	scanf("%d",&f[i]);
    	int now=f[m];
    	int num=0;
    	
    	for(int i=1;i<=m-1;i++)
    	if(f[i]<now) a[++num]=f[i];
    	a[++num]=f[m];
    	
    	for(int i=m+1;i<=n;i++)
    	if(f[i]>now) a[++num]=f[i];
    	int f0=0;
    	
    	for(int i=1;i<=num;i++)
    	{
    		if(a[i]>g[f0]) g[++f0]=a[i];
    		else g[find(0,f0,a[i])]=a[i]; 
    	}
    	cout<<f0;
    }
    

    信息

    ID
    472
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    126
    已通过
    19
    上传者