#2#10TLE,求助,自己想的优化方法

P1440 求m区间内的最小值

tjhdyhj @ 2021-08-25 21:43:21

#include <bits/stdc++.h>
using namespace std;
int main ()
{
    long long N,n[2000006],M,min=1145140000000,minn=-1,i,j;
    cin>>N>>M;
    cin>>n[1];
    cout<<"0"<<endl;
    for (i=2;i<=N;i++)
    {
        cin>>n[i];
        if (n[i-1]<min)
        {
            min=n[i-1];
            minn=i-1;
        }
        if (minn<i-M)
        {
            min=1145140000000;
            for (j=minn+1;j<=i-1;j++)
            {
                if (min>n[j])
                {
                    min=n[j];
                    minn=j;
                }
            }
        }
        cout<<min<<endl;
    }
}

by 冷月葬T魂 @ 2021-08-25 22:35:57

@tjhdyhj 话说建议输出一下min赋值后的值, min=1145140000000;是否应该为min=1145140000000ll;?(也许我在胡扯)


by tjhdyhj @ 2021-08-25 22:38:48

@冷月葬T魂 为什么最后要加“ll”呢?不懂,还有我现在是超时的问题,应该是代码优化的。(大佬%%%)


by 冷月葬T魂 @ 2021-08-25 22:43:58

@tjhdyhj 用Devc++实测,是我在胡扯。。。
认真看了一下想明白了
以下数据您就超时了:

1 2 3 ... 2000000
for (j=minn+1;j<=i-1;j++)
              {
                  if (min>n[j])
                  {
                      min=n[j];
                      minn=j;
                  }
              }

这段代码每次都要整蛊上O(m)遍,自然超时


by tjhdyhj @ 2021-08-25 22:51:53

@冷月葬T魂 啊这我放弃了(线段树看不懂的屑)(还是要谢谢巨佬%%%)


by 冷月葬T魂 @ 2021-08-25 22:56:03

@tjhdyhj (不用谢)别放弃啊,不是用单调队列吗


by tjhdyhj @ 2021-08-25 22:59:16

@冷月葬T魂 单调队列也不会回来我参考题解自学一下吧


by hy233 @ 2021-09-22 21:49:04

输入输出要优化(快读或scanf/printf)


by Kagamino_Natsumi @ 2021-09-29 14:44:01

这题千万不要用cout,会T飞


by Kamisugi @ 2021-11-11 16:07:26

cout会T,用printf


by Gkcc918 @ 2022-02-26 21:11:22

@hy233 感谢感谢我就用的cout


|