求助卡常
查看原帖
求助卡常
374433
ppip嘟嘟嘟楼主2022/12/22 17:54

rt。卡了一天了,现在92-96波动。

#include <bits/stdc++.h>
using namespace std;
const int S{1<<19};
char buf[S],*p1{0},*p2{0};
// #define getchar getchar_unlocked
#define getchar() (p1==p2&&(p2=(p1=buf)+fread_unlocked(buf,1,S,stdin),p1==p2)?EOF:*p1++)
template <typename T>
void read(T& x) {
    char c;int f{1};
    do x=(c=getchar())^48;
    while (!isdigit(c)&&c!='-');
    if (x==29) f=-1,x=0;
    while (isdigit(c=getchar()))
        x=(x<<3)+(x<<1)+(c^48);
    x*=f;
}
template <typename T,typename ...Args>
void read(T& x,Args&... args) {read(x);read(args...);}
const int N(1e5),K{254},B{N/K+1};
int a[N+5];
unsigned char fir[N+5][B+5],lst[N+5][B+5],act[N+5][B+5],ins[N+5][K+5];
int L[B+5],R[B+5],bl[N+5];
const int Kr{K},Inf{255};
bool ex[N+5];
#define P(x,y) L[x]-1+y
#define set_min(x,y) (x>y&&(x=y))
#define Set_min(x,y) ((!x||x>y)&&(x=y))
#define set_max(x,y) (x<y&&(x=y))
int main() {
    int n,m;
    read(n,m);
    memset(fir,Inf,sizeof fir);
    // memset(ins,Inf,sizeof ins);
    for (int i{1};i<=n;++i) {
        read(a[i]);
        ex[a[i]]=true;
        bl[i]=(i-1)/Kr+1;
        if (!act[a[i]][bl[i]])
            act[a[i]][bl[i]]=++act[0][bl[i]];
        if (bl[i]!=bl[i-1]) R[bl[i-1]]=i-1,L[bl[i]]=i;
        set_min(fir[a[i]][bl[i]],i-L[bl[i]]+1);
        set_max(lst[a[i]][bl[i]],i-L[bl[i]]+1);
    }
    R[bl[n]]=n;
    for (int i{1};i<=bl[n];++i)
        for (register int j{L[i]};j<=R[i];++j)
            for (register int k{j};k<=R[i];++k)
                if (act[a[j]][i]<=act[a[k]][i])
                    Set_min(ins[P(i,act[a[j]][i])][act[a[k]][i]],k-j);
                else
                    Set_min(ins[P(i,act[a[k]][i])][act[a[j]][i]],k-j);
    int last{0};
    while (m--) {
        register int op,x,y;read(op,x,y);
        x^=last;y^=last;
        if (op==1) {
            if (x==y||!ex[x]) continue;
            ex[y]|=ex[x];
            ex[x]=false;
            for (register int i{1};i<=bl[n];++i) {
                register int X{act[x][i]},Y{act[y][i]};
                if (X&&Y) {
                    register int j{1};
                    for (;j<=act[0][i]&&j<=X&&j<=Y;++j)
                        set_min(ins[P(i,j)][Y],ins[P(i,j)][X]);
                    if (j<=Y) for (;j<=act[0][i]&&j<=Y;++j)
                        set_min(ins[P(i,j)][Y],ins[P(i,X)][j]);
                    else for (;j<=act[0][i]&&j<=X;++j)
                        set_min(ins[P(i,Y)][j],ins[P(i,j)][X]);
                    for (;j<=act[0][i];++j)
                        set_min(ins[P(i,Y)][j],ins[P(i,X)][j]);
                    set_min(fir[y][i],fir[x][i]);fir[x][i]=Inf;
                    set_max(lst[y][i],lst[x][i]);lst[x][i]=0;
                } else if (X) {
                    act[y][i]=act[x][i];
                    fir[y][i]=fir[x][i];fir[x][i]=Inf;
                    lst[y][i]=lst[x][i];lst[x][i]=0;
                }
                act[x][i]=0;
            }
        } else {
            if (!ex[x]||!ex[y]) {
                last=0;puts("Ikaros");
                continue;
            }
            if (x==y) {
                last=0;puts("0");
                continue;
            }
            int lsx{-n},lsy{-n},ans{n+1};
            for (register int i{1};i<=bl[n];++i) {
                register int X{act[x][i]},Y{act[y][i]};
                if (X>Y) swap(X,Y);
                if (fir[x][i]^Inf) set_min(ans,fir[x][i]-lsy+L[i]-1);
                if (fir[y][i]^Inf) set_min(ans,fir[y][i]-lsx+L[i]-1);
                if (X&&Y) set_min(ans,ins[P(i,X)][Y]);
                if (lst[x][i]) lsx=lst[x][i]+L[i]-1;
                if (lst[y][i]) lsy=lst[y][i]+L[i]-1;
            }
            printf("%d\n",last=ans);
        }
    }
    return 0;
}
2022/12/22 17:54
加载中...