用的两次二分的解法,测试点下载下来自测没问题,机房里一大佬用Linux测也没问题,但交上去就是WA
求路过 dalao debug
我的代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define MAXN 100005
using namespace std;
string in;
int n,num[MAXN],dp1[MAXN],ans1,dp2[MAXN],ans2;
void getNum()
{
getline(cin,in);
int len=in.size(),pt=0;
while(pt<len){
int ans=0;
char ch=in[pt];
while(pt<len && (ch<'0' || ch>'9')) ch=in[++pt];
while(pt<len && (ch>='0' && ch<='9')) ans=ans*10+ch-'0',ch=in[++pt];
num[++n]=ans;
}
return ;
}
int find1(int myNum)
{
int l=1,r=ans1;
while(l<=r){
int mid=l+(r-l)/2;
if(dp1[mid]==myNum) return mid;
else if(myNum>dp1[mid]) r=mid-1;
else l=mid+1;
}
return r;
}
int find2(int myHih)
{
int l=1,r=ans2;
while(l<=r){
int mid=l+(r-l)/2;
if(dp2[mid]==myHih) return mid;
else if(myHih<dp2[mid]) r=mid-1;
else l=mid+1;
}
return l;
}
int main()
{
getNum();
for(int i=1;i<=n;i++){
int pt=find1(num[i]);
dp1[pt+1]=num[i];
ans1=max(ans1,pt+1);
}
for(int i=1;i<=n;i++){
int pt=find2(num[i]);
dp2[pt]=num[i];
ans2=max(ans2,pt);
}
cout<<ans1<<"\n"<<ans2<<endl;
return 0;
}