TLE求调
查看原帖
TLE求调
755359
Uridine_楼主2023/11/10 22:34
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

template<typename t>
struct Stable
{
    private:
    t**     _data;
    int*    _log2;
    int     _maxn;
    int     _maxl;
    void MemInit(int maxn)
    {
        _maxn=maxn+5;_maxl=(int)(log2(_maxn)+5);
        _data=new  t*[_maxn];
        _log2=new int[_maxn];
        memset(_log2,0,sizeof(t)*_maxn);
        for(int i=2;i<_maxn;i++)
            _log2[i]=_log2[i>>1]+1;
        for(int i=0;i<_maxn;i++)
        {
            _data[i]=new t[_maxl];
            memset(_data[i],0,(_maxl)*sizeof(t));
        }
    }
    public:
    void Build(t* data,int maxn)
    {
        MemInit(maxn);
        for(int i=1;i<=maxn;i++)
            _data[i][0]=data[i];
        for(int l=1;l<_maxl;l++)
        {
            for(int s=1;s+(1<<l)-1<=maxn;s++)
            {
                _data[s][l]=max(_data[s][l-1],_data[s+(1<<(l-1))][l-1]);
            }
        }
    }
    t Inquire(int l,int r)
	{
		int ll=_log2[r-l+1];
        return max(_data[l][ll],_data[r-(1<<ll)+1][ll]);
	}
    ~Stable()
    {
        for(int i=0;i<_maxn;i++)
           delete []  _data[i];
        delete [] _data;
        delete [] _log2;
    }
};

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int main()
{
    int n,m;cin>>n>>m;
    int* tmp=new int[n+2];
    for(int i=1;i<=n;i++)
        tmp[i]=read();
    Stable<int> stable;
    stable.Build(tmp,n);
    delete [] tmp;
    for(int i=1;i<=m;i++)
    {
        int a,b;cin>>a>>b;
        cout<<stable.Inquire(a,b)<<endl;
    }
}
2023/11/10 22:34
加载中...