제출 #955493

#제출 시각아이디문제언어결과실행 시간메모리
955493yoav_sNewspapers (CEOI21_newspapers)C++17
20 / 100
1095 ms604 KiB
#include <bits/stdc++.h> using namespace std; typedef int ll; typedef vector<ll> v; typedef vector<v> vv; typedef vector<vv> vvv; typedef pair<ll,ll> p; typedef vector<p> vp; typedef vector<vp> vvp; typedef vector<vvp> vvvp; typedef pair<ll, p> tri; typedef vector<tri> vtri; typedef vector<vtri> vvtri; typedef vector<vvtri> vvvtri; typedef vector<bool> vb; typedef vector<vb> vvb; typedef vector<vvb> vvvb; #define f first #define s second #define pb push_back #define eb emplace_back #define all(v) (v).begin(),(v).end() const ll INF = 1e18; const ll mod = 1e9 + 7; void eulerTour(ll i, v &visited, vv &graph, v &res, ll &uniqCount, ll nonLeafCount) { res.pb(i); visited[i]++; uniqCount++; for (ll x : graph[i]) { if (visited[x] == 0 && graph[x].size() > 1) { eulerTour(x,visited,graph,res,uniqCount, nonLeafCount); if (uniqCount < nonLeafCount) { res.pb(i); visited[i]++; } } } } ll nonLeafSubtreeCount(ll i, v &res, vv &graph) { if (res[i] != -1 || graph[i].size() == 1) return 0; res[i] = 1; for (ll x : graph[i]) res[i] += nonLeafSubtreeCount(x, res, graph); return res[i]; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); ll N, M; cin >> N >> M; vv graph(N); for (ll i= 0; i < M; i++) { ll a, b; cin >> a >> b; graph[a-1].pb(b-1); graph[b-1].pb(a-1); } if (M != N - 1) { cout << "NO\n"; return 0; } //theory - find euler tour, check if visiting a vertex thrice (at least). if yes, then NO. otherwise check if works. if not, repeat twice if (N == 1) { cout << "YES\n1\n1\n"; return 0; } if (N == 2) { cout << "YES\n2\n1 1\n"; return 0; } ll mini = INF; v minTour; for (ll i= 0; i < N; i++) { if (graph[i].size() == 1) continue; ll valid = 0; for (ll x : graph[i]) if (graph[x].size() > 1) valid++; if (valid > 1) continue; v nonLeafSubtreeCounts(N, -1); nonLeafSubtreeCount(i, nonLeafSubtreeCounts, graph); for (ll i = 0; i < N; i++) sort(all(graph[i]),[&nonLeafSubtreeCounts](ll i, ll j){return nonLeafSubtreeCounts[i] < nonLeafSubtreeCounts[j];}); ll cnt = 0; v visited(N, 0); v tour; ll nonLeafCount = 0; for (auto x : graph) if (x.size() != 1) nonLeafCount++; eulerTour(i, visited, graph, tour, cnt, nonLeafCount); vb available(N, true); bool poss = true; for (ll x : tour) { available[x] = false; vb newGeneration(N, false); for (ll i = 0 ;i < N; i++) if (available[i]) for (ll x : graph[i]) newGeneration[x] = true; available = newGeneration; } for (ll i = 0; i < N; i++) if (available[i]) poss = false; if (!poss) { v newTour1; for (ll x : tour) newTour1.pb(x); for (ll x : tour) newTour1.pb(x); poss = true; available = vb(N, true); for (ll x : newTour1) { available[x] = false; vb newGeneration(N, false); for (ll i = 0 ;i < N; i++) if (available[i]) for (ll x : graph[i]) newGeneration[x] = true; available = newGeneration; } for (ll i = 0; i < N; i++) if (available[i]) poss = false; if (poss) tour = newTour1; else { v newTour2; for (ll x : tour) newTour2.pb(x); for (ll i = tour.size() - 1; i >= 0; i--) newTour2.pb(tour[i]); poss = true; available = vb(N, true); for (ll x : newTour2) { available[x] = false; vb newGeneration(N, false); for (ll i = 0 ;i < N; i++) if (available[i]) for (ll x : graph[i]) newGeneration[x] = true; available = newGeneration; } for (ll i = 0; i < N; i++) if (available[i]) poss = false; if (poss) tour = newTour2; } } if (poss) { mini = tour.size(); minTour = tour; break; } } if (mini == INF) { cout << "NO\n"; return 0; } cout << "YES\n"; cout << mini << "\n"; for (ll x : minTour) cout << x + 1 << " "; cout << "\n"; return 0; }

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

newspapers.cpp:27:16: warning: overflow in conversion from 'double' to 'll' {aka 'int'} changes value from '1.0e+18' to '2147483647' [-Woverflow]
   27 | const ll INF = 1e18;
      |                ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...