70分代码,6WA,7TLE
查看原帖
70分代码,6WA,7TLE
109220
Farkas_W楼主2020/7/28 15:16
#include<iostream>
#include<cmath>
#include<cstdio>
#include<iomanip>
#include<algorithm>
using namespace std;
int n,k,a[500005],b[250005],t,c[500005];
void ss(int x,int y)
{
	int i,j;
	c[x]=1;c[y]=1;
	for(i=x+1;i<=y;i++)
	{
		int m=0;
		for(j=x;j<i;j++)
		if(a[i]>a[j]&&c[j]>0){
			m=max(m,c[j]+1);
		}
		c[i]=m;
	}
	t+=c[y];
}
int main()
{
	freopen("aa.in","r",stdin);
	freopen("aa.out","w",stdout);
	int i,j;
	cin>>n>>k;
	for(int i=1;i<=k;i++)cin>>b[i],c[b[i]]=1;//间隔 
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		if(i<=b[1])c[i]=1;
	}
	sort(b+1,b+k+1);
	for(int i=1;i<k;i++)
	if(a[b[i]]>=a[b[i+1]]){
		cout<<"impossible"<<endl;
		return 0;
	}
	a[n+1]=-1;a[0]=1000000005;
	for(i=1;i<=b[1];i++)
	{
		c[i]=1;
		if(i>1){
			for(j=1;j<i;j++)
			if(a[j]<a[i])
			c[i]=max(c[i],c[j]+1);
		}
	}
	t+=c[b[1]];
	for(i=n;i>=a[k];i--)
	{
		c[i]=1;
		if(i<n){
			for(j=n;j>i;j--)
			if(a[j]>a[i])
			c[i]=max(c[i],c[j]+1);
		}
	}
	t+=c[b[k]];
	for(int i=1;i<k;i++)
	{
		ss(b[i],b[i+1]);
	}
	cout<<t-k<<endl;
}

依次计算1-b[1],b[1]-b[2]---b[k-1]-b[k],b[k]=n之间最长不下降数列

2020/7/28 15:16
加载中...