제출 #1259194

#제출 시각아이디문제언어결과실행 시간메모리
1259194user736482Jail (JOI22_jail)C++20
49 / 100
264 ms230840 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define pb push_back #define ff first #define ss second #define MOD 1000000007 #define INF 1000000019 #define POT (1<<21) #define INFL 1000000000000000099LL #define LG 17 int par[120000+1][LG],idxg[120001][LG][2],dpt[120001],dg[3000000]; vector<ll>g[120000+1],g2[3000000]; ll a,b,n,m; void dfs(ll v,ll pop,ll dp){ par[v][0]=pop; dpt[v]=dp; for(ll i : g[v]){ if(i!=pop)dfs(i,v,dp+1); } } ll ak; void solve(){ cin>>n; for(ll i=1;i<=n;i++){ g[i].clear(); } for(ll i=1;i<n;i++){ cin>>a>>b; g[a].pb(b); g[b].pb(a); } dfs(1,1,0); ak=2*n+1;// i<=n oznacza v poczatkow <=n, i<=2*n to v koncow cin>>m; vector<pair<ll,ll>>pth; vector<ll>idx; for(ll i=0;i<m;i++){ cin>>a>>b; pth.pb({a,b}); idx.pb(ak++); g2[ak-1].pb(a); g2[n+b].pb(ak-1); } for(ll i=1;i<=n;i++){ if(i==1){ idxg[i][0][0]=0; idxg[i][0][1]=ak++; continue; } idxg[i][0][0]=par[i][0]; idxg[i][0][1]=n+par[i][0]; } for(ll i=0;i<ak;i++){ // cout<<i<<": "; // for(ll j : g2[i])cout<<j<<" "; // cout<<"\n"; } //cout<<"\n\n"; for(ll i=1;i<=n;i++){ // cout<<i<<" "<<0<<" "<<idxg[i][0][0]<<" "<<idxg[i][0][1]<<"\n"; } for(ll j=1;j<LG;j++){ for(ll i=1;i<=n;i++){ par[i][j]=par[par[i][j-1]][j-1]; idxg[i][j][0]=ak;//0 - przed g2[idxg[i][j-1][0]].pb(ak); g2[idxg[par[i][j-1]][j-1][0]].pb(ak++); idxg[i][j][1]=ak;//1 - po g2[ak].pb(idxg[i][j-1][1]); g2[ak++].pb(idxg[par[i][j-1]][j-1][1]); // cout<<i<<" "<<j<<" "<<idxg[i][j][0]<<" "<<idxg[i][j][1]<<"\n"; } } for(ll i=0;i<m;i++){ a=pth[i].ff; b=pth[i].ss; ll moj=idx[i]; g2[moj].pb(a+n); g2[b].pb(moj); if(dpt[a]<dpt[b])swap(a,b); ll k=dpt[a]-dpt[b]; for(ll j=LG-1;j>=0;j--){ if((k & (1<<j))){ if(par[a][j]==b){ k--; continue; } g2[idxg[a][j][0]].pb(moj); g2[moj].pb(idxg[a][j][1]); a=par[a][j]; } } if(b==par[a][0])continue; for(ll j=LG-1;j>=0;j--){ if(par[a][j]!=par[b][j]){ g2[idxg[a][j][0]].pb(moj); g2[moj].pb(idxg[a][j][1]); a=par[a][j]; g2[idxg[b][j][0]].pb(moj); g2[moj].pb(idxg[b][j][1]); b=par[b][j]; } } ll j=0; g2[idxg[a][j][0]].pb(moj); g2[moj].pb(idxg[a][j][1]); a=par[a][j]; g2[idxg[b][j][0]].pb(moj); g2[moj].pb(idxg[b][j][1]); b=par[b][j]; } for(ll i=0;i<ak;i++){ for(ll j : g2[i])dg[j]++; } queue<int>q; ll x=0; for(ll i=0;i<ak;i++){ if(dg[i]==0)q.push(i); } while(q.size()){ a=q.front(); q.pop(); x++; for(ll i : g2[a]){ dg[i]--; if(dg[i]==0)q.push(i); } } if(x==ak)cout<<"Yes\n"; else cout<<"No\n"; for(ll i=0;i<ak;i++){g2[i].clear();dg[i]=0;} } int main(){ ios_base::sync_with_stdio(0);cin.tie(0); ll T; cin>>T; while(T--){solve();} }
#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...