제출 #306522

#제출 시각아이디문제언어결과실행 시간메모리
306522vivaan_gupta슈퍼트리 잇기 (IOI20_supertrees)C++14
11 / 100
249 ms22232 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 pll pair<ll,ll> #define f first #define s second #define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++) // #define int ll #define sz(x) (ll)x.size() #define all(x) (x.begin(),x.end()) using namespace std; const ll INF = 1e12; const ll N =(1e5+5); // TODO : change value as per problem const ll MOD = 1e9+7; 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++){ 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; 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; break; } else if(p[wow[i][j]][wow[i][k]] == 1) { cnt++; idx = wow[i][j]; idx2 = wow[i][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; } assert(cnt == 1); ans[idx][idx2] = 1; ans[idx2][idx] = 1; vector<int> v; for(int j = 0;j<sz;j++){ if(j != x && j != y){ 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; ans[idx][v.back()] = 1; ans[v.back()][idx] = 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:158:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  158 |    for(int j= 0;j<wow[i].size()-1;j++){
      |                 ~^~~~~~~~~~~~~~~~
supertrees.cpp:229:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  229 |   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...