제출 #306546

#제출 시각아이디문제언어결과실행 시간메모리
306546vivaan_gupta슈퍼트리 잇기 (IOI20_supertrees)C++14
11 / 100
259 ms22196 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; int idx = -1,idx2 = -1; int x = -1,y = -1; vector<pll> gg1,gg2; 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++; // idx = wow[i][j]; // idx2 = wow[i][k]; gg1.pb(mp(wow[i][j],wow[i][k])); gg2.pb(mp(j,k)); // x = j; // y = 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 == 1); for(auto P:gg1){ ans[P.f][P.s] = 1; ans[P.s][P.f] = 1; } vector<int> v; for(int j = 0;j<sz;j++){ bool poss =true; for(int k = 0;k<gg2.size();k++){ poss &= (j != gg2[k].f); } if(poss) 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; } 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:235:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  235 |    for(int k = 0;k<gg2.size();k++){
      |                  ~^~~~~~~~~~~
supertrees.cpp:240:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  240 |   for(int j = 0;j<v.size()-1;j++){
      |                 ~^~~~~~~~~~~
supertrees.cpp:191:7: warning: unused variable 'idx' [-Wunused-variable]
  191 |   int idx = -1,idx2 = -1;
      |       ^~~
supertrees.cpp:191:16: warning: unused variable 'idx2' [-Wunused-variable]
  191 |   int idx = -1,idx2 = -1;
      |                ^~~~
supertrees.cpp:192:7: warning: unused variable 'x' [-Wunused-variable]
  192 |   int x = -1,y = -1;
      |       ^
supertrees.cpp:192:14: warning: unused variable 'y' [-Wunused-variable]
  192 |   int x = -1,y = -1;
      |              ^
#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...