是不是UB了
查看原帖
是不是UB了
685993
Akagi_shigeru楼主2023/10/19 20:02

rt,本地测过了,洛谷测没过。

#include<bits/stdc++.h>
using namespace std;
namespace my_IO{
    #define ll long long
    #define ull unsigned long long
    #define ld long double
    #define spc putchar(' ')
    #define et putchar('\n')
    template<class T>
    void read(T &num){
        T x=0,f=1;
        char c=getchar();
        while(!isdigit(c)){
            if(c=='-') f=-1;
            c=getchar();
        }
        while(isdigit(c)){
            x=(x<<3)+(x<<1)+c-48;
            c=getchar();
        }
        num=f*x;
    }
    template<class T>
    void write(T x){
        static char buf[40];
        static int len=-1;
        if(x<0) putchar('-'),x=-x;
        do{
            buf[++len]=x%10+48;
            x/=10;
        }while(x);
        while(len>=0) putchar(buf[len--]);
    }
}
using namespace my_IO;
const int maxn=5510;
int n,m,siz[maxn],U[maxn],D[maxn],L[maxn],R[maxn],cnt,fst[maxn],row[maxn],col[maxn],ans[maxn],ansd;
void init(){
    for(int i=0;i<=m;++i){
        L[i]=i-1,R[i]=i+1;
        U[i]=D[i]=i;
        ++siz[i];
    }
    L[0]=m,R[m]=0;
    cnt=m;
}
inline void add(int r,int c){
    D[++cnt]=D[c],U[cnt]=c,U[D[c]]=cnt,D[c]=cnt;
    col[cnt]=c,row[cnt]=r,++siz[c];
    if(!fst[r]) fst[r]=R[cnt]=L[cnt]=cnt;
    else{
        R[cnt]=R[fst[r]],L[cnt]=fst[r];
        L[R[fst[r]]]=cnt,R[fst[r]]=cnt;
    }
}
void remove(int c){
    R[L[c]]=R[c],L[R[c]]=L[c];
    for(int u=D[c];u!=c;u=D[u]){
        for(int v=R[u];v!=u;v=R[v]){
            --siz[col[v]];
            D[U[v]]=D[v],U[D[v]]=U[v];
        }
    }
}
void recover(int c){
    R[L[c]]=L[R[c]]=c;
    for(int u=D[c];u!=c;u=D[u]){
        for(int v=R[u];v!=u;v=R[v]){
            ++siz[col[v]];
            D[U[v]]=U[D[v]]=v;
        }
    }
}
bool dance(int dep){
    if(R[0]==0){
        ansd=dep-1;
        return 1;
    }
    int c=R[0];
    for(int u=R[0];u!=0;u=R[u]) if(siz[u]<siz[c]) c=u;
    remove(c);
    for(int u=D[c];u!=c;u=D[u]){
        ans[dep]=row[u];
        for(int v=R[u];v!=u;v=R[v]) remove(col[v]);
        if(dance(dep+1)) return 1;
        for(int v=R[u];v!=u;v=R[v]) recover(col[v]);
    }
    recover(c);
    return false;
}
void solve(){
    read(n),read(m);
    init();
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            int x;
            read(x);
            if(x) add(i,j);
        }
    }
    if(dance(1)) for(int i=1;i<=ansd;++i) write(ans[i]),spc;
    else puts("No Solution!");
}
int main(){
    int t=1;
    while(t--) solve();
}

2023/10/19 20:02
加载中...