牛客(多校4):Eliminate++

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N],b[N],n,now[N<<2][3],num[N<<2][3];
char ans[N];
void read(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",a+i),b[a[i]]=i;
}
void update(int x){
    for(int i=0;i<3;i++)now[x][i]=now[x<<1|1][now[x<<1][i]],
    num[x][i]=num[x<<1][i]+num[x<<1|1][now[x<<1][i]];
}
int w;
void build(int x,int l,int r){
    if(l==r){
        if(a[l]==w)for(int i=0;i<3;i++)num[x][i]=now[x][i]=0;
        else for(int i=0;i<3;i++)num[x][i]=i/2,now[x][i]=i%2+1;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid),build(x<<1|1,mid+1,r);
    update(x);
}
int L,R;
void change(int x,int l,int r){
    if(l==r){
        for(int i=0;i<3;i++)num[x][i]=0,now[x][i]=i-1;
        now[x][0]=0;
        return;
    }
    int mid=(l+r)>>1;
    if(L<=mid)change(x<<1,l,mid);
    else change(x<<1|1,mid+1,r);
    update(x);
}
void query(int x,int l,int r,int &no,int &nu){
    if(L<=l&&R>=r){nu+=num[x][no],no=now[x][no];return;}
    int mid=(l+r)>>1;
    if(L<=mid)query(x<<1,l,mid,no,nu);
    if(R>mid)query(x<<1|1,mid+1,r,no,nu);
}
void work(){
    read();int n1=(n+1)/2,no,nu;
    w=1,build(1,1,n);
    for(int i=1;i<n1;i++){
        no=nu=0;L=1,R=b[i]-1;
        if(L<=R)query(1,1,n,no,nu);
        L=b[i]+1,R=n,no=0;
        if(L<=R)query(1,1,n,no,nu);
        if(nu>=abs(n1-i))ans[b[i]]='1';
        else ans[b[i]]='0';
        L=b[i],change(1,1,n);
    }
    ans[b[n1]]='1';
    w=n,build(1,1,n);
    for(int i=n;i>n1;i--){
        no=nu=0;L=1,R=b[i]-1;
        if(L<=R)query(1,1,n,no,nu);
        L=b[i]+1,R=n,no=0;
        if(L<=R)query(1,1,n,no,nu);
        if(nu>=abs(n1-i))ans[b[i]]='1';
        else ans[b[i]]='0';
        L=b[i],change(1,1,n);
    }
    ans[n+1]=0;
    puts(ans+1);
}
int main(){
    int t;scanf("%d",&t);
    while(t--)work();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107478247