Submission #1302372

#TimeUsernameProblemLanguageResultExecution timeMemory
1302372clue_Towers (NOI22_towers)C++20
0 / 100
56 ms18276 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int long long #define pii pair<ll, ll> #define fi first #define se second const ll N = 5e5 + 5, inf = 1e9, mod = 1e9 + 7, block = 320, lim = 20; int n, m; vector <int> adj[N]; int d[N]; namespace sub1 { // duong thang int in[N], euler[N]; int tdfs; void dfs1(int u, int par) { in[u] = ++tdfs; euler[tdfs] = u; for (auto v : adj[u]) { if (v != par) { dfs1(v, u); } } } void solve() { int cnt = 0; for (int i = 1; i <= n; i++) { cnt += (d[i] > -1); } if (cnt == 0) { cout << n << '\n'; for (int i = 1; i <= n; i++) cout << i << ' '; } else { dfs1(1, 0); vector <int> res, res1; bool okL = 1, okR = 1; for (int i = 1; i <= tdfs; i++) { int idx = euler[i]; if (d[idx] != -1) { if (i > d[i]) { int lst = i - d[i]; res.push_back(euler[lst]); } else okL = 0; if (i + d[i] <= tdfs) { int nxt = i + d[i]; res1.push_back(euler[nxt]); } else okR = 0; } } sort(res.begin(), res.end()); res.erase(unique(res.begin(), res.end()), res.end()); sort(res1.begin(), res1.end()); res1.erase(unique(res1.begin(), res1.end()), res1.end()); vector <int> ans; if (res.size() == 1 && okL) ans.push_back(res.back()); if (res1.size() == 1 && okR) ans.push_back(res1.back()); if (res.size() == 1 && res1.size() == 1 && res.back() == res1.back()) ans.push_back(res.back()); sort(ans.begin(), ans.end()); ans.erase(unique(ans.begin(), ans.end()), ans.end()); cout << ans.size() << '\n'; for (auto x : ans) cout << x << ' '; } } } namespace sub2 { int dist[N]; void bfs() { for (int i = 1; i <= n; i++) dist[i] = inf; dist[1] = 0; queue <int> q; q.push(1); while(q.size()) { auto u = q.front(); q.pop(); for (auto v : adj[u]) { if (dist[v] > dist[u] + 1) { dist[v] = dist[u] + 1; q.push(v); } } } } void solve() { bfs(); vector <int> res; for (int i = 1; i <= n; i++) { if (dist[i] == d[1]) res.push_back(i); } cout << res.size() << '\n'; for (auto x : res) cout << x << ' '; } } namespace sub3 { int dist[N]; void bfs(int id) { for (int i = 1; i <= n; i++) dist[i] = inf; dist[id] = 0; queue <int> q; q.push(id); while(q.size()) { auto u = q.front(); q.pop(); for (auto v : adj[u]) { if (dist[v] > dist[u] + 1) { dist[v] = dist[u] + 1; q.push(v); } } } } void solve() { vector <int> have, nhave; for (int i = 1; i <= n; i++) { if (d[i] < 0) have.push_back(i); else if (d[i] > 0) { nhave.push_back(i); } else { have.push_back(i); nhave.push_back(i); } } vector <int> res; for (auto x : have) { bfs(x); bool check = 1; for (auto y : nhave) { if (d[y] != dist[y]) { check = 0; break; } } if (check) res.push_back(x); } cout << res.size() << '\n'; for (auto x : res) cout << x << ' '; } } int deg[N]; signed main() { ios::sync_with_stdio(false); cin.tie(0); if (fopen("cross.inp", "r")) { freopen("cross.inp", "r", stdin); freopen("cross.out", "w", stdout); } cin >> n >> m; for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; deg[u]++, deg[v]++; adj[u].push_back(v); adj[v].push_back(u); } for (int i = 1; i <= n; i++) cin >> d[i]; bool checksub1 = 1, checksub2 = 1; int cntsub1 = 0; for (int i = 1; i <= n; i++) { if (deg[i] > 2) checksub1 = 0; if (deg[i] == 1) cntsub1++; if (i != 1 && d[i] != -1) checksub2 = 0; } // sub3::solve(); return 0; if (checksub1 && cntsub1 == 2) { sub1::solve(); return 0; } if (checksub2) { sub2::solve(); return 0; } sub3::solve(); return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:154:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  154 |         freopen("cross.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:155:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  155 |         freopen("cross.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...