求调
查看原帖
求调
229474
DreamSpaceDream楼主2023/11/13 19:15

k=4

#include<bits/stdc++.h>
#define pb push_back
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=5e4,K=4,M=3e4;
int k;
int n;
int a[K+1][N+1];
int ans;
inline void S1(){
    int i,j;
    int mn=M,mx=0;
    for(i=1;i<=n;i++)mn=min(mn,a[1][i]),mx=max(mx,a[1][i]);
    ans=mx-mn;
    printf("%d\n",ans); 
    return ;
}
inline void S2(){
    int i,j;
    int mn1,mx1,mn2,mx2;
    mn1=mn2=M,mx1=mx2=0;
    for(i=1;i<=n;i++){
        if(a[1][i]>a[2][i])swap(a[1][i],a[2][i]);
        mn1=min(mn1,a[1][i]),mn2=min(mn2,a[2][i]);
        mx1=max(mx1,a[1][i]),mx2=max(mx2,a[2][i]); 
    }
    ans=max(mx1-mn1,mx2-mn2);
    printf("%d\n",ans);     
    return ;
}
struct ST{
    struct S{
        int h,t;
        int mx;bool cl;
        int l;
    }T[N*4+1];
    inline void F(int p,int k){T[p].mx+=k,T[p].l+=k;return ;}
    inline void PU(int p){
        if(T[p].cl)T[p<<1].mx=T[p<<1|1].mx=T[p<<1].l=T[p<<1|1].l=0,T[p<<1].cl=T[p<<1|1].cl=true,T[p].cl=false;
        F(p<<1  ,T[p].l);    
        F(p<<1|1,T[p].l);
        T[p].l=0;
        return ;
    }
    inline void PD(int p){
        T[p].mx=max(T[p<<1].mx,T[p<<1|1].mx);
        return ;
    }
    inline void B(int p,int l,int r){
        T[p].h=l,T[p].t=r;T[p].mx=T[p].l=0;T[p].cl=false;
        if(l==r)return ;
        int mid=l+r>>1;
        B(p<<1  ,l    ,mid);
        B(p<<1|1,mid+1,r  );
    }
    inline void CL(int p){T[p].mx=T[p].cl=0,T[p].cl=true;}
    inline void UD(int p,int l,int r,int k){
        if(l<=T[p].h&T[p].t<=r){F(p,k);return ;}
        int mid=T[p].h+T[p].t>>1;
        PU(p);
        if(l<=mid)UD(p<<1  ,l,r,k);
        if(r> mid)UD(p<<1|1,l,r,k);
        PD(p);
        return ; 
    }
    inline int   Q(int p,int l,int r){
        if(l<=T[p].h&T[p].t<=r)return T[p].mx;
        int ans=0;
        int mid=T[p].h+T[p].t>>1;
        PU(p);
        if(l<=mid)ans=max(ans,Q(p<<1  ,l,r));
        if(r> mid)ans=max(ans,Q(p<<1|1,l,r));
        return ans; 
    }
}st;
int mn3,mx3;
vector<int> g;
inline bool C3(int k){
    int i,j;
    int mn;
    //1,2
    st.CL(1);
    for(i=1;i<=n;i++){
        g.clear();
        if(a[1][i]<=mn3+k&&a[2][i]>=mx3-k)g.pb(a[3][i]);
        if(a[2][i]<=mn3+k&&a[3][i]>=mx3-k)g.pb(a[1][i]);
        if(a[3][i]<=mn3+k&&a[1][i]>=mx3-k)g.pb(a[2][i]);
        if(!g.size())break;
        sort(g.begin(),g.end());
        mn=mn3-1;
        for(auto t:g)st.UD(1,max(mn+1,t-k),t,1),mn=t;
    }
    if(st.Q(1,mn3,mx3)==n)return true;
    //1,3
    st.CL(1);
    for(i=1;i<=n;i++){
        g.clear();
        if(a[1][i]<=mn3+k&&a[3][i]>=mx3-k)g.pb(a[2][i]);
        if(a[2][i]<=mn3+k&&a[1][i]>=mx3-k)g.pb(a[3][i]);
        if(a[3][i]<=mn3+k&&a[2][i]>=mx3-k)g.pb(a[1][i]);
        if(!g.size())break;
        sort(g.begin(),g.end());
        mn=mn3-1;
        for(auto t:g)st.UD(1,max(mn+1,t-k),t,1),mn=t;
    }
    if(st.Q(1,mn3,mx3)==n)return true;
    return false;  
}
inline void S3(){
    int i;
    mn3=M,mx3=0;
    for(i=1;i<=n;i++){
        mn3=min(mn3,min(a[1][i],min(a[2][i],a[3][i])));
        mx3=max(mx3,max(a[1][i],max(a[2][i],a[3][i])));
    }
    int l=0,r=mx3-mn3,mid;
    st.B(1,mn3,mx3);
    while(l<r){
        mid=l+r>>1;
        if(C3(mid))r=mid;
        else       l=mid+1;
    }
    printf("%d\n",r);
    return ;
}
pii f[K+1];int tf;
struct E{
    int h;
    int l,r;
    int k;
}e[N*K+1];int tt;
inline bool C(E x,E y){
    if(x.h!=y.h)return x.h<y.h;
    if(x.k!=y.k)return x.k>y.k;
    return false;
}
int X[K*2+1],tx,Y[K*2+1],ty;
bool G[K*2+1][K*2+1]; 
inline bool C4(int k){
    int i,j,l;
    //1,2
    tt=0;
    int xh,xl,xr;
    int yh,yl,yr;
    for(i=1;i<=n;i++){
        tf=0; 
        if(a[1][i]<=mn3+k&&a[2][i]>=mx3-k)f[++tf]=mp(a[3][i],a[4][i]);
        if(a[2][i]<=mn3+k&&a[3][i]>=mx3-k)f[++tf]=mp(a[4][i],a[1][i]);
        if(a[3][i]<=mn3+k&&a[4][i]>=mx3-k)f[++tf]=mp(a[1][i],a[2][i]);
        if(a[4][i]<=mn3+k&&a[1][i]>=mx3-k)f[++tf]=mp(a[2][i],a[3][i]);
        if(!tf)break;
        sort(f+1,f+tf+1);
        for(j=1;j<=tf;j++){
            xh=max(mn3,f[j].fi-k),xl=max(mn3,f[j].se-k),xr=f[j].se;
            for(l=1 ;l<j;l++){
                yh=        f[l].fi   ,yl=max(mn3,f[l].se-k),yr=f[l].se;
                
                if(xh<=yh){
                    if(yl<=xl)xl=max(xl,yr);
                    if(yr>=xr)xr=min(xr,yl);
                }  
            }
            if(xl<=xr)e[++tt]=(E){xh,xl,xr, 1};
            xh=        f[j].fi   ,xl=max(mn3,f[j].se-k),xr=f[j].se;
            for(l=tf;l>j;l--){
                yh=max(mn3,f[l].fi-k),yl=max(mn3,f[l].se-k),yr=f[l].se;
                if(xh>=yh){
                    if(yl<=xl)xl=max(xl,yr);
                    if(yr>=xr)xr=min(xr,yl);
                }
            }
            if(xl<=xr)e[++tt]=(E){xh,xl,xr,-1};
        }
        printf("\n");
    }
    if(i>n){
        sort(e+1,e+tt+1,C);
        st.CL(1);
        for(i=1;i<=tt;i++){
            st.UD(1,e[i].l,e[i].r,e[i].k);
            if(st.Q(1,mn3,mx3)==n)return true; 
        }
    }
    //1,3
    tt=0;
    for(i=1;i<=n;i++){  
        if(a[1][i]<=mn3+k&&a[3][i]>=mx3-k)f[++tf]=mp(a[2][i],a[4][i]);
        if(a[2][i]<=mn3+k&&a[4][i]>=mx3-k)f[++tf]=mp(a[3][i],a[1][i]);
        if(a[3][i]<=mn3+k&&a[1][i]>=mx3-k)f[++tf]=mp(a[4][i],a[2][i]);
        if(a[4][i]<=mn3+k&&a[2][i]>=mx3-k)f[++tf]=mp(a[1][i],a[3][i]);
        if(!tf)break;
        sort(f+1,f+tf+1);
        for(j=1;j<=tf;j++){
            xh=max(mn3,f[j].fi-k),xl=max(mn3,f[j].se-k),xr=f[j].se;
            for(l=1 ;l<j;l++){
                yh=        f[l].fi   ,yl=max(mn3,f[l].se-k),yr=f[l].se;
                if(xh<=yh){
                    if(yl<=xl)xl=max(xl,yr);
                    if(yr>=xr)xr=min(xr,yl);
                }  
            }
            if(xl<=xr)e[++tt]=(E){xh,xl,xr, 1};
            xh=        f[j].fi   ,xl=max(mn3,f[j].se-k),xr=f[j].se;
            for(l=tf;l>j;l--){
                yh=max(mn3,f[l].fi-k),yl=max(mn3,f[l].se-k),yr=f[l].se;
                if(xh>=yh){
                    if(yl<=xl)xl=max(xl,yr);
                    if(yr>=xr)xr=min(xr,yl);
                }
            }
            if(xl<=xr)e[++tt]=(E){xh,xl,xr,-1};
        } 
    }
    if(i>n){
        sort(e+1,e+tt+1,C);
        st.CL(1);
        for(i=1;i<=tt;i++){
            st.UD(1,e[i].l,e[i].r,e[i].k);
            if(st.Q(1,mn3,mx3)==n)return true; 
        }
    }
    //1,4
    tt=0;
    for(i=1;i<=n;i++){
        tf=0;  
        if(a[1][i]<=mn3+k&&a[4][i]>=mx3-k)f[++tf]=mp(a[2][i],a[3][i]);
        if(a[2][i]<=mn3+k&&a[1][i]>=mx3-k)f[++tf]=mp(a[3][i],a[4][i]);
        if(a[3][i]<=mn3+k&&a[2][i]>=mx3-k)f[++tf]=mp(a[4][i],a[1][i]);
        if(a[4][i]<=mn3+k&&a[3][i]>=mx3-k)f[++tf]=mp(a[1][i],a[2][i]);
        if(!tf)break;
        sort(f+1,f+tf+1);
        for(j=1;j<=tf;j++){
            xh=max(mn3,f[j].fi-k),xl=max(mn3,f[j].se-k),xr=f[j].se;
            for(l=1 ;l<j;l++){
                yh=        f[l].fi   ,yl=max(mn3,f[l].se-k),yr=f[l].se;
                if(xh<=yh){
                    if(yl<=xl)xl=max(xl,yr);
                    if(yr>=xr)xr=min(xr,yl);
                }  
            }
            if(xl<=xr)e[++tt]=(E){xh,xl,xr, 1};
            xh=        f[j].fi   ,xl=max(mn3,f[j].se-k),xr=f[j].se;
            for(l=tf;l>j;l--){
                yh=max(mn3,f[l].fi-k),yl=max(mn3,f[l].se-k),yr=f[l].se;
                if(xh>=yh){
                    if(yl<=xl)xl=max(xl,yr);
                    if(yr>=xr)xr=min(xr,yl);
                }
            }
            if(xl<=xr)e[++tt]=(E){xh,xl,xr,-1};
        }
    }
    if(i>n){
        sort(e+1,e+tt+1,C);
        st.CL(1);
        for(i=1;i<=tt;i++){
            st.UD(1,e[i].l,e[i].r,e[i].k);
            if(st.Q(1,mn3,mx3)==n)return true; 
        }
    }
    return false;
} 
inline void S4(){
    int i;
    mn3=M,mx3=0;
    for(i=1;i<=n;i++){
        mn3=min(mn3,min(min(a[1][i],a[2][i]),min(a[3][i],a[4][i])));
        mx3=max(mx3,max(max(a[1][i],a[2][i]),max(a[3][i],a[4][i])));
    }
    int l=0,r=mx3-mn3,mid;
    st.B(1,mn3,mx3);
    while(l<r){
        mid=l+r>>1;
        if(C4(mid))r=mid;
        else       l=mid+1;
    }
    printf("%d\n",r);
    return ;
}
inline int R(){
    char c=getchar();
    int s=1;
    for(;!('0'<=c&&c<='9'||c=='-');c=getchar());
    if(c=='-'){
        s=-1;
        c=getchar();
    }
    int num=0;
    while('0'<=c&&c<='9'){
        num=num*10+(c-'0');
        c=getchar();
    }
    num=num*s;
    return num;
}
int main(){
    int i,j; 
   // freopen("lock.in","r",stdin);
   // freopen("lock.out","w",stdout);
    int T=R();k=R();
    while(T--){
        n=R();
        for(i=1;i<=k;i++)
            for(j=1;j<=n;j++)
                a[i][j]=R();
        if(k==1)S1(); 
        if(k==2)S2();
        if(k==3)S3();
        if(k==4)S4();
    } 
    return 0;
}
2023/11/13 19:15
加载中...