Submission #735054

#TimeUsernameProblemLanguageResultExecution timeMemory
735054vjudge1Connecting Supertrees (IOI20_supertrees)C++17
100 / 100
356 ms22116 KiB
#include "supertrees.h" #include <bits/stdc++.h> #define MAX 300001 #define INF LLONG_MAX #define MOD 1000000007 #define mp make_pair #define mt make_tuple #define pb push_back #define ins insert #define ff first #define ss second #define gett(x,m) get<m>(x) #define all(a) a.begin(),a.end() #define lb(a,b) lower_bound(all(a),b) #define ub(a,b) upper_bound(all(a),b) #define sortv(a) sort(all(a)) #define sorta(a,sz) sort(a,a+sz) #define inputar(a,b){\ for(int i=0;i<b;i++){\ cin >> a[i];\ }\ } #define inputvec(a,b){\ for(int i=0;i<b;i++){\ ll num;\ cin >> num;\ a.pb(num);\ }\ } #define outputar(a,b){\ for(int i=0;i<b;i++){\ cout << a[i] << " ";\ }\ cout << "\n";\ } #define outputvec(a){\ for(auto x:a){\ cout << x << " ";\ }\ cout << "\n";\ } using namespace std; typedef long long ll; typedef unsigned long long ull; typedef tuple<ll,ll,ll> tll; typedef pair<ll,ll> pll; typedef double db; typedef long double ldb; inline void USACO(string filename){ freopen((filename+".in").c_str(),"r",stdin); freopen((filename+".out").c_str(),"w",stdout); } struct dsu{ vector<ll> e; void init(int n){ e.resize(n+1,-1); } int get(int x){ if(e[x]<0){ return x; } else{ return e[x]=get(e[x]); } } int size(int x){ return -e[get(x)]; } bool same_set(int x,int y){ return (get(x)==get(y)); } bool unite(int x,int y){ x=get(x); y=get(y); if(x==y){ return false; } if(e[x]>e[y]){ swap(x,y); } e[x]+=e[y]; e[y]=x; return true; } }; int construct(vector<vector<int>> p) { int n = p.size(); dsu d; d.init(n); vector<vector<int>> answer; answer.resize(n,vector<int>(n,0)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(p[i][j]==1){ d.unite(i,j); } if(p[i][j]==3){ return 0; } } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(d.same_set(i,j) && p[i][j]!=1){ //cout << 1 << "\n"; return 0; } } } dsu d2; dsu d3; d2.init(n); d3.init(n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(p[i][j]==2){ d2.unite(d.get(i),d.get(j)); } else if(p[i][j]==3){ d3.unite(d.get(i),d.get(j)); } } } for(int i=0;i<n;i++){ if(d2.size(i)==2){ //cout << 2 << "\n"; return 0; } } for(int i=0;i<n;i++){ if(d3.size(i)==2 || d3.size(i)==3){ //cout << 3 << "\n"; return 0; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(p[i][j]==0 && (d2.same_set(i,j) || d3.same_set(i,j))){ return 0; } if(d2.same_set(i,j) && d3.same_set(i,j) && i!=j){ //cout << 4 << "\n"; return 0; } } } set<ll> st; for(int i=0;i<n;i++){ st.ins(i); } for(int i=0;i<n;i++){ if(st.find(i)==st.end()){ continue; } vector<int> c; for(auto x:st){ if(d.same_set(i,x)){ c.pb(x); } } for(int i=1;i<c.size();i++){ answer[c[i-1]][c[i]]=1; answer[c[i]][c[i-1]]=1; } for(auto x:c){ st.erase(x); } } st.clear(); for(int i=0;i<n;i++){ st.ins(i); } for(int i=0;i<n;i++){ if(st.find(i)==st.end()){ continue; } set<int> e; vector<int> c; for(auto x:st){ if(d2.same_set(i,x)){ e.ins(d.get(x)); } } for(auto x:e){ c.pb(x); } if(c.size()>1){ for(int i=1;i<c.size();i++){ answer[c[i-1]][c[i]]=1; answer[c[i]][c[i-1]]=1; } answer[c[0]][c[c.size()-1]]=1; answer[c[c.size()-1]][c[0]]=1; } for(auto x:c){ st.erase(x); } } st.clear(); for(int i=0;i<n;i++){ st.ins(i); } for(int i=0;i<n;i++){ if(st.find(i)==st.end()){ continue; } set<int> e; vector<int> c; for(auto x:st){ if(d3.same_set(i,x)){ e.ins(d.get(x)); } } for(auto x:e){ c.pb(x); } if(c.size()>1){ for(int i=1;i<c.size();i++){ answer[c[i-1]][c[i]]=1; answer[c[i]][c[i-1]]=1; } answer[c[0]][c[c.size()-1]]=1; answer[c[c.size()-1]][c[0]]=1; answer[c[1]][c[c.size()-1]]=1; answer[c[c.size()-1]][c[1]]=1; } for(auto x:c){ st.erase(x); } } build(answer); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:161:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  161 |      for(int i=1;i<c.size();i++){
      |                  ~^~~~~~~~~
supertrees.cpp:188:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  188 |          for(int i=1;i<c.size();i++){
      |                      ~^~~~~~~~~
supertrees.cpp:218:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  218 |          for(int i=1;i<c.size();i++){
      |                      ~^~~~~~~~~
#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...