这种题题解洛谷上很明白,这里我放了我自己写的ac代码,并有一些注释
对了,大家不是很喜欢用万能头文件吗?真到比赛如果tle了,我建议把万能头文件改成iostream这些的,因为速度可以快一倍!
如果这道题有什么问题或者洛谷上还是不懂,就评论区问我,看到就回,这道题我断断续续花一天时间,也可以说是搞懂了
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e5 + 520,INF = 0x3f3f3f3f;
int cnt,t,h[N],f[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
while(cin>>h[++cnt]);
cnt--;
t = 0;fill(f,f+1+cnt,0);
f[0] = INF;
for(int i = 1 ; i <= cnt ; i++){
int l = 0,r = t+1;//t我理解是阔界因数;
while(r > l){
int mid = l+r >> 1;
if(f[mid] >= h[i]) l = mid+1;//长度为mid的不增子序列的最小,而我们找最长的情况,因为f(i)>=f(i+1),即f单调不增
else r = mid;
}
int x = l;
t = max(x,t);
f[x] = h[i];
}
cout << t << endl;
t = 0;fill(f,f+1+cnt,0);
for(int i = 1 ; i <= cnt ; i++){
int l = 0,r = t+1;
while(r>l){
int mid = l+r >> 1;
if(f[mid] >= h[i]) r = mid;//这里我们要找最小的情况,所以我们缩小范围
else l = mid+1;
}
int x = l;
t = max(x,t);
f[x] = h[i];
}
cout << t << endl;
return 0;
}
冷知识:
加载头文件会算到编译时间里,一般时间限制是限制运行时间
tle和万能头有什么关系