求助回滚莫队,TLE暴力分
查看原帖
求助回滚莫队,TLE暴力分
444040
Echoternity楼主2022/8/10 20:43

自己按照历史研究打的板子,不知道假没假,该卡常的地方都卡了,求助了qwq

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<iomanip>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define gh() getchar()
#define re register
typedef long long ll;
template<class T>
inline void read(T &x)
{
    x=0;
    char ch=gh(),t=0;
    while(ch<'0'||ch>'9') t|=ch=='-',ch=gh();
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=gh();
    if(t) x=-x;
}
template<class T,class ...T1>
inline void read(T &x,T1 &...x1)
{
    read(x),read(x1...);
}
template<class T>
inline void write(T x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
template<class T>
inline bool checkMax(T &x,T &y)
{
    return x<y?x=y,1:0;
}
template<class T>
inline bool checkMin(T &x,T &y)
{
    return x>y?x=y,1:0;
}
const int MAXN=2e5+10;
int N,M,Val[MAXN],Uni;
int Cnt[MAXN],ans[MAXN];
struct query
{
    int l,r,id;
    bool operator<(const query &x) const
    {
        if(l/Uni!=x.l/Uni) return l<x.l;
        return r<x.r;
    }
}Q[MAXN];
std::vector<int>Nums;
inline void add(int pos,int dir,int &res)
{
    if(!Cnt[pos]) Cnt[pos]=dir;
    res=std::max(res,dir-Cnt[pos]);
}
std::vector<int>Change;
inline void Solve()
{
    std::sort(Q+1,Q+1+M);
    for(int i=1;i<=M;)
    {
        int j=i;
        while(j<=M&&Q[j].l/Uni==Q[i].l/Uni) ++j;
        int right=(Q[i].l/Uni)*Uni+Uni-1;
        while(i<j)
        {
            int res=0;
            auto q=Q[i];
            for(int k=q.l;k<=q.r;++k) add(Val[k],k,res);
            ans[q.id]=res;
            for(int k=q.l;k<=q.r;++k) Cnt[Val[k]]=0;
            ++i;
        }
        int res=0;
        int l=right,r=right+1;
        while(i<j)
        {
            auto q=Q[i];
            while(l<q.r) ++l,add(Val[l],l,res),Change.push_back(Val[l]);
            int backup=res;
            while(r>q.l) --r,add(Val[r],r,res),Change.push_back(Val[r]);
            ans[q.id]=res;
            while(r<right+1) Cnt[Val[r++]]=0;
            res=backup;
            ++i;
        }
        for(auto cl:Change) Cnt[Change[cl]]=0;
        Change.clear();
    }
}
int main()
{
    // freopen("backup-moalgo.in","r",stdin);
    // freopen("backup-moalgo.out","w",stdout);
    read(N);
    for(int i=1;i<=N;++i) read(Val[i]),Nums.push_back(Val[i]);
    std::sort(Nums.begin(),Nums.end());
    Nums.erase(std::unique(Nums.begin(),Nums.end()),Nums.end());
    for(int i=1;i<=N;++i) Val[i]=std::lower_bound(Nums.begin(),Nums.end(),Val[i])-Nums.begin();
    read(M);
    Uni=std::sqrt((double)N*N/(double)M)+1;
    for(int i=1;i<=M;++i)
    {
        read(Q[i].l,Q[i].r);
        Q[i].id=i;
    }
    Solve();
    for(int i=1;i<=M;++i) write(ans[i]),puts("");
    return 0;
}
/*
8
1 6 2 2 3 3 1 6
5
1 4
2 5
2 8
5 6
1 7
*/
2022/8/10 20:43
加载中...