Submission #1326737

#TimeUsernameProblemLanguageResultExecution timeMemory
1326737yus1f_mRailway (BOI17_railway)C++20
100 / 100
131 ms40232 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> #define ll long long #define str string #define pb push_back #define pf push_front #define in insert #define all(v) v.begin(),v.end() const int sz=100001,INF=1000000000; using namespace std; ll n,m,l,num1,num2,num,Num,t; vector<ll>Nums,idxs(sz),d(sz),tin(sz),Parent(sz),res(sz),ans; vector<bool>isSeen(sz),isSeen1(sz),isSeen2(sz); vector<vector<ll>>parent(sz,vector<ll>(21)); vector<vector<pair<ll,ll>>>nums; void dfs1(ll num1,ll num2) { isSeen1[num1]=true,tin[num1]=t,t++,idxs[num1]=num2; for(int i=0;i<nums[num1].size();i++) { if(!isSeen1[nums[num1][i].first]) { parent[nums[num1][i].first][0]=num1,d[nums[num1][i].first]=d[num1]+1,Parent[nums[num1][i].first]=num1; dfs1(nums[num1][i].first,nums[num1][i].second); } } } void dfs2(ll num) { isSeen2[num]=true; for(int i=0;i<nums[num].size();i++) { if(!isSeen2[nums[num][i].first]) { dfs2(nums[num][i].first); res[num]+=res[nums[num][i].first]; } } } ll lca(ll num1,ll num2) { if(d[num1]<d[num2]) { swap(num1,num2); } for(int i=20;i>=0;i--) { if(d[num1]-pow(2,i)>=d[num2]) { num1=parent[num1][i]; } } if(num1==num2) { return num1; } else { for(int i=20;i>=0;i--) { if(parent[num1][i]!=parent[num2][i]) { num1=parent[num1][i],num2=parent[num2][i]; } } return parent[num1][0]; } } bool comp(ll num1,ll num2) { if(tin[num1]<tin[num2]) { return true; } else { return false; } } void solve() { cin>>n>>m>>l; nums.resize(n+1); for(int i=0;i<n-1;i++) { cin>>num1>>num2; nums[num1].pb({num2,i+1}),nums[num2].pb({num1,i+1}); } dfs1(1,0); for(int i=1;i<=20;i++) { for(int j=1;j<=n;j++) { parent[j][i]=parent[parent[j][i-1]][i-1]; } } for(int i=0;i<m;i++) { Nums.clear(); cin>>num; for(int j=0;j<num;j++) { cin>>Num; Nums.pb(Num); } sort(all(Nums),comp); for(int j=0;j<Nums.size();j++) { res[Nums[j]]++,res[Nums[(j+1)%num]]++,res[lca(Nums[j],Nums[(j+1)%num])]-=2; } } dfs2(1); for(int i=1;i<=n;i++) { for(int j=0;j<nums[i].size();j++) { if(!isSeen[idxs[nums[i][j].first]] && res[nums[i][j].first]>=2*l) { ans.pb(idxs[nums[i][j].first]),isSeen[idxs[nums[i][j].first]]=true; } } } cout<<ans.size()<<"\n"; for(int i=0;i<ans.size();i++) { cout<<ans[i]<<" "; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr),cout.tie(nullptr); ll t=1; //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...