//最长不上升子序列
#include <iostream>
using namespace std;
int num[100005];
int dp[100005];
int cnt = 1;
int main() {
int s = 0, w = 1, index = 1;//s表示数值,w表示符号
char c;
bool flag = 1;
while(1) {
c = getchar();
while(c < '0' || c > '9') {
if(c == '-')
w *= -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
s = s * 10 + c - '0';
c = getchar();
}
num[index] = w * s;
index++;
w = 1, s = 0;
if(c == '\n')
break;
}
dp[1] = num[1];
for(int i = 2; i < index; i++) {
if(num[i] <= dp[cnt])
dp[++cnt] = num[i];
else {
int l = 1, r = cnt;
int ans = 1;
while(l <= r) {
int mid = (l + r) / 2;
if(dp[mid] <= num[i]) {
r = mid - 1;
ans = mid;
}
else {
l = mid + 1;
}
}
dp[ans] = num[i];
}
}
printf("%d\n", cnt);
cnt = 1;
//贪心:选择高度最低的那个导弹防御系统拦截
for(int i = 1; i < index; i++) {
dp[i] = 0;
}
for(int i = 1; i < index; i++) {
int l = 1, r = cnt;
while(l <= r) {
int mid = (l + r) / 2;
if(num[i] > dp[mid])
l = mid + 1;
else
r = mid - 1;
}
int x = l;
if(x > cnt) {
cnt = x;
dp[x] = num[i];
}
}
printf("%d\n", cnt);
return 0;
}
上面的是我的读入方法,本地能得到正确答案,但洛谷评判时全TLE。
while(~scanf("%d",&num[++index]));
这种是题解的读入方法,但我Devcpp(VS也是)会卡住死循环