在洛谷运行超时但在自家电脑不超时
查看原帖
在洛谷运行超时但在自家电脑不超时
467051
wjb572301559楼主2024/1/22 12:28
#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;
}

上面的是我的代码(C的),在洛谷开了O2优化说是数组访问越界(Segment fault with invalid memory reference)(因为我只用了数组),在我家的电脑却运行正常 没开O2优化是TLE 所以说为什么

2024/1/22 12:28
加载中...