제출 #306568

#제출 시각아이디문제언어결과실행 시간메모리
306568vivaan_gupta슈퍼트리 잇기 (IOI20_supertrees)C++14
11 / 100
296 ms22264 KiB
#include <algorithm> #include <bitset> #include <cassert> #include <chrono> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <iterator> #include <limits> #include <list> #include <map> #include <numeric> #include <queue> #include <random> #include <ratio> #include <set> #include <sstream> #include <stack> #include <string> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> #include <climits> #include "supertrees.h" #define ll long long #define ld long double #define mp make_pair #define pb push_back #define in insert #define vll vector<ll> #define endl "\n" #define f first #define s second #define pll pair<int,int> // #define int ll using namespace std; struct DSU { int connected; vector<int> par, sz; void init(int n) { par = sz = vector<int> (n + 1, 0); for(int i = 1; i <= n; i++) par[i] = i, sz[i] = 1; connected = n; } int getPar(int u) { while(u != par[u]) { par[u] = par[par[u]]; u = par[u]; } return u; } int getSize(int u) { return sz[getPar(u)]; } void unite(int u, int v) { int par1 = getPar(u), par2 = getPar(v); if(par1 == par2) return; connected--; if(sz[par1] > sz[par2]) swap(par1, par2); sz[par2] += sz[par1]; sz[par1] = 0; par[par1] = par[par2]; } }; int construct(std::vector<std::vector<int>> p) { DSU g; int n = p.size(); g.init(n-1); std::vector<std::vector<int>> ans; for (int i = 0; i < n; i++) { std::vector<int> row; row.resize(n); ans.push_back(row); } bool ok = false; bool ok2 = false; for(int i = 0;i<n;i++){ for(int j = 0;j<n;j++){ ok |= (p[i][j] == 1); ok2 |= (p[i][j] == 2); } } if(!ok2 && !ok){ for(int i =0;i<n;i++){ for(int j =0;j<n;j++){ ans[i][j] =0; } } build(ans); return 1; } if(!ok){ for(int i =0;i<n;i++){ for(int j =i+1;j<n;j++){ if(p[i][j] == 2){ g.unite(i,j); } } } map<int,int> col; vector<int> wow[n+1]; int c = 1; for(int i =0;i<n;i++){ int op = g.getPar(i); if(col[op] == 0){ col[op] = c; c++; } wow[col[op]].pb(i); } c--; for(int i =0;i<n;i++){ for(int j =0;j<n;j++){ ans[i][j] = 0; } } for(int i =1;i<=c;i++){ if(wow[i].size() == 1) continue; for(int j= 0;j<wow[i].size()-1;j++){ ans[wow[i][j]][wow[i][j+1]] = 1; ans[wow[i][j+1]][wow[i][j]] = 1; } ans[wow[i].back()][wow[i][0]] = 1; ans[wow[i][0]][wow[i].back()] = 1; } build(ans); return 1; } for(int i =0;i<n;i++){ for(int j =i+1;j<n;j++){ if(p[i][j] > 0){ g.unite(i,j); } } } map<int,int> col; vector<int> wow[n+1]; int c = 1; for(int i =0;i<n;i++){ int op = g.getPar(i); if(col[op] == 0){ col[op] = c; c++; } wow[col[op]].pb(i); } c--; for(int i =0;i<n;i++){ for(int j =0;j<n;j++){ ans[i][j] = 0; } } for(int i =1;i<=c;i++){ int sz = wow[i].size(); ok = false; int cnt = 0; vector<pll> gg1,gg2; set<int> let; for(int j =0;j<sz;j++){ for(int k = j+1;k<sz;k++){ if(p[wow[i][j]][wow[i][k]] == 2){ ok = true; } else if(p[wow[i][j]][wow[i][k]] == 1) { cnt++; let.in(wow[i][j]); let.in(wow[i][k]); gg1.pb(mp(wow[i][j],wow[i][k])); gg2.pb(mp(j,k)); } } } if(!ok){ for(int j =0;j<sz-1;j++){ ans[wow[i][j]][wow[i][j+1]] = 1; ans[wow[i][j+1]][wow[i][j]] = 1; } continue; } if(gg1.empty()){ for(int j = 0;j<sz-1;j++){ ans[wow[i][j]][wow[i][j+1]] = 1; ans[wow[i][j+1]][wow[i][j]] = 1; } ans[wow[i].back()][wow[i][0]] = 1; ans[wow[i][0]][wow[i].back()] = 1; continue; } // assert(cnt <= 5); vector<int> lol; for(auto xx:let) lol.pb(xx); for(int j =0;j<lol.size();j++){ for(int k =j+1;k<lol.size();k++){ assert(p[j][k] == 1); } } for(int i =0;i<lol.size()-1;i++){ ans[lol[i]][lol[i+1]] = 1; ans[lol[i+1]][lol[i]] = 1; } vector<int> v; v.pb(lol.back()); for(int j =0;j<sz;j++){ if(let.count(wow[i][j]) == 0){ v.pb(wow[i][j]); } } for(int j = 0;j<v.size()-1;j++){ ans[v[j]][v[j+1]] = 1; ans[v[j+1]][v[j]] = 1; } ans[v.back()][v[0]] = 1; ans[v[0]][v.back()] = 1; } for(int i=0;i<n;i++) ans[i][i] = 0; build(ans); return 1; } // void solve(){ // } // signed main(){ // ios_base::sync_with_stdio(0); // cin.tie(NULL); // // freopen(".in","r",stdin);freopen(".out","w",stdout); // ll tt=1; // // cin >> tt; // while(tt--){ // solve(); // } // }

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

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:153:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |    for(int j= 0;j<wow[i].size()-1;j++){
      |                 ~^~~~~~~~~~~~~~~~
supertrees.cpp:226:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  226 |   for(int j =0;j<lol.size();j++){
      |                ~^~~~~~~~~~~
supertrees.cpp:227:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  227 |    for(int k =j+1;k<lol.size();k++){
      |                   ~^~~~~~~~~~~
supertrees.cpp:231:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  231 |   for(int i =0;i<lol.size()-1;i++){
      |                ~^~~~~~~~~~~~~
supertrees.cpp:242:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  242 |   for(int j = 0;j<v.size()-1;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...