제출 #1047408

#제출 시각아이디문제언어결과실행 시간메모리
1047408vjudge1Split the Attractions (IOI19_split)C++17
0 / 100
2095 ms44628 KiB
#include "split.h" #include<bits/stdc++.h> using namespace std; #define ll long long int #define pb push_back #define ff first #define all(x) x.begin(), x.end() #define ss second const int N = 5e5; int n; vector<int> g[N]; vector<int> res; vector<bool> vis; int par[N]; vector<vector<bool>> edge; vector<pair<int, int>> E; void fill(int v, int par, int col, int colnum){ queue<int> q; q.push(v); vis[v] = 1; vis[par] = 1; res[v] = col; --colnum; while(!q.empty()){ int v = q.front(); q.pop(); // cout << v << ' ' << a << ' ' << b << ' ' << c << '\n'; for(int u: g[v]){ if(!vis[u] && edge[u][v]){ if(colnum > 0){ res[u] = col; --colnum; // cout << v << ' ' << 2 << '\n'; }else break; vis[u] = 1; q.push(u); } } if(colnum == 0) break; } vis[par] = 0; } vector<bool> viss; int sz[N]; void dfs(int v, int p){ sz[v] = 1; par[v] = p; viss[v] = 1; for(int u: g[v]){ if(u != p && !viss[u]){ edge[u][v] = 1; edge[v][u] = 1; E.pb({u, v}); dfs(u, v); sz[v] += sz[u]; } } } vector<int> find_split(int nn, int a, int b, int c, vector<int> Y, vector<int> X) { n = nn; if(n< 5000) edge.resize(n, vector<bool>(n)); for(int i = 1; i < Y.size(); ++i){ int r = rand() % i; swap(Y[i], Y[r]); swap(X[i], X[r]); } for(int i = 0; i < Y.size(); ++i){ g[Y[i]].pb(X[i]); g[X[i]].pb(Y[i]); } vector<pair<int, int>> arr; arr.pb({a, 1}); arr.pb({b, 2}); arr.pb({c, 3}); sort(all(arr)); for(int root = 0; root < n; ++root){ res.clear(); res.resize(n+1); vis.clear(); vis.resize(n+1); viss.clear(); viss.resize(n+1); if(n < 5000) for(auto e:E){ edge[e.ff][e.ss] = 0; edge[e.ss][e.ff] = 0; } dfs(root, n); bool ok = 0; for(int i = 0; i < n; ++i){ if(i == root) continue; if(sz[i] >= arr[0].ff && sz[root] - sz[i] >= arr[1].ff){ fill(i, par[i], arr[0].ss, arr[0].ff); fill(root, par[root], arr[1].ss, arr[1].ff); ok = 1; break; }else if(sz[i] >= arr[1].ff && sz[root] - sz[i] >= arr[0].ff){ fill(i, par[i], arr[1].ss, arr[1].ff); fill(root, par[root], arr[0].ss, arr[0].ff); ok = 1; break; } } if(!ok){ if(X.size() == nn-1) break; continue; } res.pop_back(); for(int &cc: res) if(cc == 0) cc = arr[2].ss; return res; } res.pop_back(); return res; }

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

split.cpp: In function 'std::vector<int> find_split(int, int, int, int, std::vector<int>, std::vector<int>)':
split.cpp:71:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |  for(int i = 1; i < Y.size(); ++i){
      |                 ~~^~~~~~~~~~
split.cpp:76:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |  for(int i = 0; i < Y.size(); ++i){
      |                 ~~^~~~~~~~~~
split.cpp:119:16: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  119 |    if(X.size() == nn-1) break;
      |       ~~~~~~~~~^~~~~~~
#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...