Submission #1244161

#TimeUsernameProblemLanguageResultExecution timeMemory
1244161nvujicaJail (JOI22_jail)C++20
0 / 100
5 ms8772 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second using namespace std; const int maxn = 1.2e5 + 10; int q, n, m; int bio_cen[maxn]; vector <pair<int, int> > put[maxn]; vector <int> e[maxn]; int sz[maxn]; int bitce[maxn]; vector <int> v[maxn]; int vrh[maxn]; int indeg[maxn]; int bio[maxn]; void dfs(int x, int p){ sz[x] = 1; for(auto x2: e[x]){ if(x2 == p) continue; if(bio_cen[x2]) continue; dfs(x2, x); sz[x] += sz[x2]; } } void dfs2(int x, int p){ for(auto x2: e[x]){ if(bio_cen[x2]) continue; if(x2 == p) continue; vrh[x2] = vrh[x]; dfs2(x2, x); } } bool rek(int x, int ozn){ bio[x] = ozn; // if(ozn == 2) cout << "x: " << x << endl; for(auto x2: v[x]){ // if(x == 4 && ozn == 2) cout << x2 << " " << bio[x2] << endl; if(bio[x2] == ozn){ // cout << "pa jesam" << endl; // cout << "ova dva " << x << ' ' << x2 << endl; return 0; } if(!bio[x2]){ if(!rek(x2, ozn)) return 0; } } return 1; } bool calc(int cen){ vrh[cen] = cen; for(auto x2: e[cen]){ if(bio_cen[x2]) { vrh[x2] = x2; } vrh[x2] = x2; dfs2(x2, cen); } int otk = 0; for(auto x2: e[cen]){ bio[x2] = 0; indeg[x2] = 0; } for(int i = 0; i < put[cen].size(); i++){ int s = put[cen][i].fi; int t = put[cen][i].se; if(vrh[s] == vrh[t]) continue; if(vrh[s] == cen) continue; if(vrh[t] == cen) otk = vrh[s]; v[vrh[s]].push_back(vrh[t]); // if(cen == 4) cout << "v " << vrh[s] << ' ' << vrh[t] << endl; indeg[vrh[t]]++; } if(indeg[otk]){ // cout << "ovaj " << cen << ' ' << otk << endl; return 0; } int mini = 0; for(auto x2: e[cen]){ sort(v[x2].begin(), v[x2].end()); v[x2].erase(unique(v[x2].begin(), v[x2].end()), v[x2].end()); } for(auto x2: e[cen]){ // if(bio_cen[x2]) if(bio[x2]) continue; if(indeg[x2]) continue; //if(cen == 1) cout << "krecem " << cen << ' ' << x2 << endl; if(!rek(x2, x2)) return 0; } for(auto x2: e[cen]){ if(!bio[x2]){ // if(cen == 1) cout << "tu " << x2 << endl; if(!rek(x2, x2)) return 0; } } for(auto x2: e[cen]){ if(bio_cen[x2]) continue; v[x2].clear(); indeg[x2] = 0; } return 1; } int nadji_cen(int poc){ dfs(poc, 0); // cout << "gotov " << endl; int x = poc; while(true){ bool naso = 0; // cout << x << endl; for(auto x2: e[x]){ if(bio_cen[x2]) continue; // if(x2 == p) continue; if(sz[x2] > sz[poc] / 2 && sz[x2] < sz[x]){ x = x2; naso = 1; break; } } if(!naso) break; } return x; } bool centro(int cen){ sort(put[cen].begin(), put[cen].end()); put[cen].erase(unique(put[cen].begin(), put[cen].end()), put[cen].end()); // cout << "centroid: " << cen << endl; // // cout << "putovi:" << endl; // for(int i = 0; i < put[cen].size(); i++){ // cout << put[cen][i].fi << ' ' << put[cen][i].se << endl; // } // cout << endl; // cout << endl; if(!calc(cen)) return 0; bio_cen[cen] = 1; for(auto x2: e[cen]){ if(bio_cen[x2]) continue; // for(int i = 0; i < e[x2].size(); i++){ // if(e[x2][i] == cen){ // e[x2].erase(e[x2].begin() + i); // break; // } // } bitce[x2] = nadji_cen(x2); } for(int i = 0; i < put[cen].size(); i++){ int s = put[cen][i].fi; int t = put[cen][i].se; if(vrh[s] == vrh[t]) put[bitce[vrh[s]]].push_back({s, t}); else { int a = vrh[s]; int b = vrh[t]; if(a != cen) put[bitce[a]].push_back({a, cen}); if(b != cen) put[bitce[b]].push_back({cen, b}); } } put[cen].clear(); for(auto x2: e[cen]){ if(bio_cen[x2]) continue; if(!centro(bitce[x2])) return 0; } return 1; } void solve(){ cin >> n; for(int i = 0; i < n - 1; i++){ int a, b; cin >> a >> b; e[a].push_back(b); e[b].push_back(a); } int cen = nadji_cen(1); // for(int i = 1; i <= n; i++){ // cout << sz[i] << ' '; // } // cout << endl; // cout << "cen: " << cen << endl; cin >> m; for(int i = 0; i < m; i++){ int s, t; cin >> s >> t; put[cen].push_back({s, t}); } if(centro(cen)) cout << "Yes\n"; else cout << "No\n"; // cout << endl; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin >> q; while(q--){ solve(); for(int i = 1; i <= n; i++){ e[i].clear(); v[i].clear(); vrh[i] = 0; bio[i] = 0; indeg[i] = 0; bitce[i] = 0; sz[i] = 0; put[i].clear(); bio_cen[i] = 0; } } // vector <pair<int, int> > put[maxn]; // vector <int> e[maxn]; // int sz[maxn]; // int bitce[maxn]; // vector <int> v[maxn]; // int vrh[maxn]; // int indeg[maxn]; // int bio[maxn]; return 0; }
#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...