제출 #414624

#제출 시각아이디문제언어결과실행 시간메모리
414624dolphingarlicSimurgh (IOI17_simurgh)C++14
100 / 100
222 ms6680 KiB
#include "simurgh.h" #include <bits/stdc++.h> using namespace std;int n,m,u[124750],v[124750];vector<pair<int,int>> g[500];int tin[500],low[500],timer = 0,deg[500],cmp[500];bool V[500],K[124750],G[124750];pair<int,int> B[500],par[500];vector<int> D;void d(int node = 0,int parent = -1) {V[node] = true;tin[node] = low[node] = timer++;for (pair<int,int> i : g[node]) if (i.first != parent) {if (V[i.first]) {low[node] = min(low[node],tin[i.first]);if (tin[node] > tin[i.first]) {if (B[node].first == -1 || tin[B[node].first] > tin[i.first])B[node] = i;}} else {d(i.first,node);low[node] = min(low[node],low[i.first]);if (low[i.first] > tin[node])K[i.second] = G[i.second] = true;D.push_back(i.second);par[i.first] = {node,i.second};}}}int find(int A) { return cmp[A] = (A == cmp[A] ? A : find(cmp[A])); }void onion(int A,int B) { cmp[find(A)] = find(B); }int Q(vector<int> forest) {iota(cmp,cmp + n,0);for (int i : forest) onion(u[i],v[i]);int delta = 0;for (int i : D) if (find(u[i]) != find(v[i])) {delta -= G[i];forest.push_back(i);onion(u[i],v[i]);}return count_common_roads(forest) + delta;}vector<int> find_roads(int _n,vector<int> _u,vector<int> _v) {n = _n,m = _u.size();for (int i = 0; i < m; i++) {u[i] = _u[i],v[i] = _v[i];g[u[i]].push_back({v[i],i});g[v[i]].push_back({u[i],i});}fill_n(B,n,make_pair(-1,-1));d();int D_common = count_common_roads(D);for (int i = 0; i < n; i++) if (~B[i].first) {int curr = i;bool single_K = false;vector<int> unK;while (curr != B[i].first) {if (!K[par[curr].second])unK.push_back(par[curr].second);else if (!single_K) {single_K = true;unK.push_back(par[curr].second);}curr = par[curr].first;}if (unK.size() == 1) continue;vector<int> query_res;for (int j : unK) {vector<int> to_query = {B[i].second};for (int k : D) if (k != j) to_query.push_back(k);query_res.push_back(count_common_roads(to_query));}int mx = max(D_common,*max_element(query_res.begin(),query_res.end()));for (int i = 0; i < unK.size(); i++) {K[unK[i]] = true;G[unK[i]] = (query_res[i] != mx);}}queue<int> q;for (int i = 0; i < n; i++) {vector<int> to_query;for (pair<int,int> j : g[i]) to_query.push_back(j.second);deg[i] = Q(to_query);if (deg[i] == 1) q.push(i);}while (q.size()) {int curr = q.front();q.pop();if (deg[curr] != 1) continue;int l = 0,r = g[curr].size() - 1;while (l != r) {int mid = (l + r) / 2;vector<int> to_query;for (int i = l; i <= mid; i++) to_query.push_back(g[curr][i].second);if (Q(to_query)) r = mid;else l = mid + 1;}int nxt,id;tie(nxt,id) = g[curr][l];G[id] = true;deg[nxt]--;if (deg[nxt] == 1) q.push(nxt);vector<pair<int,int>> tmp;for (pair<int,int> i : g[nxt]) if (i.second != id) tmp.push_back(i);g[nxt] = tmp;}vector<int> ans;for (int i = 0; i < m; i++) if (G[i]) ans.push_back(i);return ans;}

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

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:3:1889: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | using namespace std;int n,m,u[124750],v[124750];vector<pair<int,int>> g[500];int tin[500],low[500],timer = 0,deg[500],cmp[500];bool V[500],K[124750],G[124750];pair<int,int> B[500],par[500];vector<int> D;void d(int node = 0,int parent = -1) {V[node] = true;tin[node] = low[node] = timer++;for (pair<int,int> i : g[node]) if (i.first != parent) {if (V[i.first]) {low[node] = min(low[node],tin[i.first]);if (tin[node] > tin[i.first]) {if (B[node].first == -1 || tin[B[node].first] > tin[i.first])B[node] = i;}} else {d(i.first,node);low[node] = min(low[node],low[i.first]);if (low[i.first] > tin[node])K[i.second] = G[i.second] = true;D.push_back(i.second);par[i.first] = {node,i.second};}}}int find(int A) { return cmp[A] = (A == cmp[A] ? A : find(cmp[A])); }void onion(int A,int B) { cmp[find(A)] = find(B); }int Q(vector<int> forest) {iota(cmp,cmp + n,0);for (int i : forest) onion(u[i],v[i]);int delta = 0;for (int i : D) if (find(u[i]) != find(v[i])) {delta -= G[i];forest.push_back(i);onion(u[i],v[i]);}return count_common_roads(forest) + delta;}vector<int> find_roads(int _n,vector<int> _u,vector<int> _v) {n = _n,m = _u.size();for (int i = 0; i < m; i++) {u[i] = _u[i],v[i] = _v[i];g[u[i]].push_back({v[i],i});g[v[i]].push_back({u[i],i});}fill_n(B,n,make_pair(-1,-1));d();int D_common = count_common_roads(D);for (int i = 0; i < n; i++) if (~B[i].first) {int curr = i;bool single_K = false;vector<int> unK;while (curr != B[i].first) {if (!K[par[curr].second])unK.push_back(par[curr].second);else if (!single_K) {single_K = true;unK.push_back(par[curr].second);}curr = par[curr].first;}if (unK.size() == 1) continue;vector<int> query_res;for (int j : unK) {vector<int> to_query = {B[i].second};for (int k : D) if (k != j) to_query.push_back(k);query_res.push_back(count_common_roads(to_query));}int mx = max(D_common,*max_element(query_res.begin(),query_res.end()));for (int i = 0; i < unK.size(); i++) {K[unK[i]] = true;G[unK[i]] = (query_res[i] != mx);}}queue<int> q;for (int i = 0; i < n; i++) {vector<int> to_query;for (pair<int,int> j : g[i]) to_query.push_back(j.second);deg[i] = Q(to_query);if (deg[i] == 1) q.push(i);}while (q.size()) {int curr = q.front();q.pop();if (deg[curr] != 1) continue;int l = 0,r = g[curr].size() - 1;while (l != r) {int mid = (l + r) / 2;vector<int> to_query;for (int i = l; i <= mid; i++) to_query.push_back(g[curr][i].second);if (Q(to_query)) r = mid;else l = mid + 1;}int nxt,id;tie(nxt,id) = g[curr][l];G[id] = true;deg[nxt]--;if (deg[nxt] == 1) q.push(nxt);vector<pair<int,int>> tmp;for (pair<int,int> i : g[nxt]) if (i.second != id) tmp.push_back(i);g[nxt] = tmp;}vector<int> ans;for (int i = 0; i < m; i++) if (G[i]) ans.push_back(i);return ans;}
      |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ~~^~~~~~~~~~~~
#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...