제출 #697680

#제출 시각아이디문제언어결과실행 시간메모리
697680DJeniUp슈퍼트리 잇기 (IOI20_supertrees)C++17
40 / 100
186 ms22128 KiB
#include "supertrees.h"
#include "bits/stdc++.h"

using namespace std;

typedef long long ll;
typedef pair<ll,ll>pairll;

#define pb push_back
#define fr first
#define sc second
#define INF 10000000007

vector<vector<int> >ans;

ll h,f[1007],pr[1007],k[1007];

vector<ll>v[1007];

ll A(ll x){
    if(pr[x]!=x)pr[x]=A(pr[x]);
    return pr[x];
}

void S(ll x,ll y){
    if(rand()%2==0)swap(x,y);
    pr[A(x)]=A(y);
    return ;
}

int construct(std::vector<std::vector<int>> p) {
	ll n = p.size();
    
	for (int i = 0; i < n; i++) {
        pr[i]=i;
		std::vector<int> row;
		row.resize(n);
		ans.pb(row);
	}
    for(int i=0;i<n;i++){
        if(f[i]==0){
            for(int j=0;j<i;j++){
                if(p[i][j]==1){
                    ans[i][j]=1;
                    ans[j][i]=1;
                    S(i,j);
                    break;
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=1;j<=h;j++){
            ll fl=0;
            for(auto it:v[j]){
                if(p[i][it]!=2)fl=1;
            }
            //if(f[i]==2 && fl==0 && A(i)!=A(v[j][0]))return 0;
            if(fl==0 && A(i)!=A(v[j][0])){
                //cout<<i<<" "<<j<<endl;
                S(i,v[j][0]);
                v[j].pb(i);
                f[i]=2;
            }
        }
        if(f[i]!=2){
            for(int j=0;j<i;j++){
                if(p[i][j]==2 && A(i)!=A(j)){
                    
                    h++;
                    S(i,j);
                    //cout<<i<<" "<<h<<endl;
                    //cout<<j<<" "<<h<<endl;
                    f[i]=2;
                    f[j]=2;
                    v[h].pb(i);
                    v[h].pb(j);
                    break;
                }
            }
        }
    }
    //cout<<1<<endl;
    for(int i=0;i<n;i++){
        if(f[i]==0){
            for(int j=0;j<n;j++){
                if(p[i][j]==1 && f[j]==2){
                    f[i]=3;
                    k[i]=j;
                    break;
                }
            }
        }
    }
    //for(int i=0;i<n;i++)cout<<f[i]<<" ";
    //cout<<endl;
    
    for(int i=0;i<n;i++){
        for(int j=0;j<i;j++){
            if(p[i][j]==0){
                if(A(j)==A(i))return 0;
            }
            if(p[i][j]==1){
                if(f[i]==3 && f[j]==3 && k[i]==k[j])continue;
                else if(f[i]==2 && f[j]==3 && i==k[j])continue;
                else if(f[i]==3 && f[j]==2 && j==k[i])continue;
                else if(f[i]==0 && f[j]==0 && A(i)==A(j))continue;
                else return 0;
            }
            if(p[i][j]==2){
                if(f[i]==2 && f[j]==2 && A(i)==A(j))continue;
                else if(f[i]==2 && f[j]==3 && k[j]!=i)continue;
                else if(f[i]==3 && f[j]==2 && k[i]!=j)continue;
                else return 0;
            }
            if(p[i][j]==3)return 0;
        }
    }
    //cout<<2<<endl;
    for(int i=1;i<=h;i++){
        if(v[i].size()<=2)return 0;
        for(int j=1;j<v[i].size();j++){
            ans[v[i][j]][v[i][j-1]]=1;
            ans[v[i][j-1]][v[i][j]]=1;
        }
        ans[v[i][v[i].size()-1]][v[i][0]]=1;
        ans[v[i][0]][v[i][v[i].size()-1]]=1;
    }
    //cout<<3<<endl;
	build(ans);
	return 1;
}

컴파일 시 표준 에러 (stderr) 메시지

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:122:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |         for(int j=1;j<v[i].size();j++){
      |                     ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...