Submission #1353833

#TimeUsernameProblemLanguageResultExecution timeMemory
1353833AvianshBOI Acronym (BOI25_boi)C++20
0 / 100
1095 ms16140 KiB
#include <bits/stdc++.h>

using namespace std;

struct dsu{
    vector<int>root;
    vector<int>siz;
    dsu(int n){
        root=vector<int>(n);
        iota(root.begin(),root.end(),0);
        siz=vector<int>(n,1);
    }
    int findRoot(int x){
        if(x==root[x])
            return x;
        return root[x]=findRoot(root[x]);
    }
    bool unite(int x, int y){
        x=findRoot(x);
        y=findRoot(y);
        if(x==y){
            return 0;
        }
        if(siz[x]<siz[y]){
            swap(x,y);
        }
        root[y]=x;
        siz[x]+=siz[y];
        return 1;
    }
};

const int mxn = 505;

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    int grid[n][n];
    for(int i = 0;i<n;i++){
        for(int j = i;j<n;j++){
            cin >> grid[i][j];
        }
    }
    bitset<mxn>uneq[n];
    dsu ds(n);
    for(int i = 0;i<n;i++){
        for(int j = i+1;j<n;j++){
            if(grid[i][j]-grid[i][j-1]==1&&grid[i][j-1]==grid[i+1][j]){
                ds.unite(i,j);
            }
            else{
                if(grid[i][j]==1){
                    uneq[i].set(j);
                    uneq[j].set(i);
                }
            }
        }
    }
    for(int root = 0;root<n;root++){
        bitset<mxn>b;
        for(int i = 0;i<n;i++){
            if(ds.findRoot(i)==root){
                b|=uneq[i];
            }
        }
        for(int i = 0;i<n;i++){
            if(ds.findRoot(i)==root){
                uneq[i]=b;
            }
        }
    }
    for(int i = 0;i<n;i++){
        for(int j = 0;j<n;j++){
            for(int k = 0;k<n;k++){
                if(uneq[i][j]&&uneq[j][k]&&uneq[i][k]){
                    for(int l = 0;l<n;l++){
                        if(uneq[j][l]&&uneq[k][l]){
                            ds.unite(i,l);
                            int root = ds.findRoot(i);
                            bitset<mxn>b;
                            for(int i = 0;i<n;i++){
                                if(ds.findRoot(i)==root){
                                    b|=uneq[i];
                                }
                            }
                            for(int i = 0;i<n;i++){
                                if(ds.findRoot(i)==root){
                                    uneq[i]=b;
                                }
                            }
                        }
                    }
                    for(int l = 0;l<n;l++){
                        if(uneq[i][l]&&uneq[k][l]){
                            ds.unite(j,l);
                            int root = ds.findRoot(j);
                            bitset<mxn>b;
                            for(int i = 0;i<n;i++){
                                if(ds.findRoot(i)==root){
                                    b|=uneq[i];
                                }
                            }
                            for(int i = 0;i<n;i++){
                                if(ds.findRoot(i)==root){
                                    uneq[i]=b;
                                }
                            }
                        }
                    }
                    for(int l = 0;l<n;l++){
                        if(uneq[i][l]&&uneq[j][l]){
                            ds.unite(k,l);
                            int root = ds.findRoot(k);
                            bitset<mxn>b;
                            for(int i = 0;i<n;i++){
                                if(ds.findRoot(i)==root){
                                    b|=uneq[i];
                                }
                            }
                            for(int i = 0;i<n;i++){
                                if(ds.findRoot(i)==root){
                                    uneq[i]=b;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    int ans = 0;
    for(int i = 0;i<n;i++){
        int x = ds.findRoot(i);
        if(ds.siz[x]>ds.siz[ans]){
            ans=x;
        }
    }
    for(int i = 0;i<n;i++){
        if(ds.findRoot(i)==ans){
            cout << i+1 << " ";
        }
    }
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...