网址如下:
P1020 [NOIP1999 提高组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
怪,实在是怪
怎么会出现在自家电脑运行时间无限接近于0,在洛谷测试的时候超时的情况
在洛谷的o2优化中,是说我的数组访问越界了
但是看不出来哪里有
测试点1的运行时间:
最下面的,接近于0
在洛谷上的:
代码如下:
#include<stdio.h>
#include<ctype.h>
void scanf_line(void);
int dic(int l, int u, int hi);
int dic_2(int l, int u, int hi);
int dp[100001], f[100001], num[100001], g[100001];
int len, maxn = 1, minn = 1;
int main(void)
{
//输入
scanf_line();
//求最长不递增子序列
f[1] = g[1] = num[1];
for(int i = 2; i <= len; i++)
{
//二分法求fx最逼近hi时的x,更新dp以及f,maxn
//初始时的意外情况
if(f[1] <= num[i]) dp[i] = 1, f[1] = num[i];
else if(f[maxn] >= num[i])dp[i] = ++maxn, f[maxn] = num[i];
//正常情况
else
{
dp[i] = dic(1, maxn, num[i]) + 1;
f[dp[i]] = num[i];
}
//二分法求此时的minn值并更新g
//初始时的意外情况
if(g[1] > num[i]) g[1] = num[i];
else if(g[minn] < num[i]) g[++minn] = num[i];
//正常情况
else g[dic_2(1, minn, num[i])] = num[i];
}
//输出
printf("%d\n%d", maxn, minn);
return 0;
}
void scanf_line(void)
{
int ext = 0;
for(char c; (c = getchar()) != '\n'; )
if(isdigit(c))
ext = ext * 10 + c - '0';
else
num[++len] = ext, ext = 0;
num[++len] = ext;
return;
}
int dic(int l, int u, int hi)
{
if(u - l <= 1) return l;
int mid = (l + u) / 2;
if(f[mid] < hi) return dic(l, mid, hi);
else if(f[mid] > hi) return dic(mid, u, hi);
else return mid;
}
int dic_2(int l, int u, int hi)
{
if(u - l <= 1) return u;
int mid = (l + u) / 2;
if(g[mid] < hi) return dic_2(mid, u, hi);
else if(g[mid] > hi) return dic_2(l, mid, hi);
else return mid;
}
参考的题解:
题解 P1020 【[NOIP1999 普及组] 导弹拦截】 - 古明地觉世界第一! - 洛谷博客 (luogu.com.cn)