$CF1142B$ $Lynyrd Skynyrd$

\(CF1142B\) \(Lynyrd Skynyrd\)c++

分析性質加無修區間最大。spa

考慮找到\(A\)中每一個數在\(P\)中的前驅在\(A\)中的位置。code

那麼咱們的一個循環移位就至關因而以一個數爲開頭,向前跳\(n-1\)步。get

倍增求出一個數向前跳\(n-1\)步的位置,維護一下區間最大值。it

若是區間最大\(\geq L\),就輸出\(1\),不然爲\(0\)class

其實咱們還能夠將他看爲一棵樹,由於沒有強制在線,咱們就能夠用棧\(\mathcal{O}(n)\)求出其\(n-1\)級祖先。循環

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int f=1,w=0;char x=0;
    while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
    while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
    return w*f;
}
const int N=4e5+10;
int n,m,Q;
int A[N],P[N],Las[N],Id[N];
int f[N][25],Max[N][25],Log[N];
int main(){
#ifndef ONLINE_JUDGE
    freopen("A.in","r",stdin);
#endif
    n=read(),m=read(),Q=read();
    for(int i=1;i<=n;i++) P[i]=read();
    for(int i=1;i<=m;i++) A[i]=read();
    for(int i=1;i<=n;i++) Las[P[i]]=P[i-1],Las[P[1]]=P[n];
    for(int i=2;i<=N-10;i++) Log[i]=Log[i>>1]+1;
    for(int i=1;i<=m;i++)
        f[i][0]=Id[Las[A[i]]],Id[A[i]]=i;
    for(int j=1;j<=Log[n];j++)
        for(int i=1;i<=m;i++)
            f[i][j]=f[f[i][j-1]][j-1];
    for(int i=1;i<=m;i++)
    {
        int S=0;Max[i][0]=i;
        for(int j=Log[n-1];j>=0;j--)
            if(S+(1<<j)<=n-1)
                Max[i][0]=f[Max[i][0]][j],S+=(1<<j);
    }
    for(int j=1;j<=Log[m];j++)
        for(int i=1;i+(1<<j)-1<=m;i++)
            Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);
    while(Q--)
    {
        int L=read(),R=read(),X=Log[R-L+1];
        int End=max(Max[L][X],Max[R-(1<<X)+1][X]);
        End>=L?printf("1"):printf("0");
    }
    return 0;
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息