求救!导弹拦截40分WA

题目:

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,len1,len2;
long long a[30010],dp1[30010],dp2[30010];
int main()
{
	while(cin>>a[n])
    {
		n++;
	}
	len1=1,len2=1;
	dp1[1]=a[1],dp2[1]=a[1];
	for(int i=2;i<=n;i++)
    {
		if(a[i]<=dp1[len1])
        {
            len1++;
			dp1[len1]=a[i];
		}
		else
        {
			int k1=upper_bound(dp1+1,dp1+len1+1,a[i],greater<int>())-dp1;
			dp1[k1]=a[i]; 
		}
		if(a[i]>dp2[len2])
        {
            len2++;
			dp2[len2]=a[i];
		}
		else
        {
			int k2=lower_bound(dp2+1,dp2+len2+1,a[i])-dp2;
			dp2[k2]=a[i];
		}
	}
	cout<<len1<<endl<<len2;
	return 0;
}
6 个赞

我有洛谷70分的要吗

1 个赞


。。。

3 个赞

额…

1 个赞

我过了,此贴结

5 个赞

WA掉原因:a数组下标忘了从一开始

6 个赞

初始化的时候把n=1,在输入完n–就A了

5 个赞

能告诉我这是啥么意思吗

1 个赞

upper_bound(start,end,val);

就是从start到end之间找到第一个比val大的值

5 个赞

由于内部实现是由二分实现的,所以要加一个greater(从小到大排序)让序列有序

5 个赞

lower_bound(start,end,val)

也是差不多,只不过是找到大于等于val的数

5 个赞