Submission #347031

#TimeUsernameProblemLanguageResultExecution timeMemory
347031FatihSolakRailway (BOI17_railway)C++17
100 / 100
350 ms71784 KiB
#include <bits/stdc++.h> #define ff first #define ss second #define endl "\n" #define all(x) (x).begin(), (x).end() using namespace std; const int INF = (int) 1e9; const int mod = (int) 1e9+7; const int MAXN = (int) 3e5+5; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> pll; int n,m,k; vector<int> adj[MAXN]; int fake[MAXN]; int cnt = 1; int arr[MAXN]; vector<int> nums[MAXN]; map<pii,int> mp; map<pii,int> edge; vector<pii> query; vector<set<int>> sets(MAXN); vector<int> ans; int pare[MAXN]; void dfs(int v,int par){ fake[v] = cnt++; for(auto u:adj[v]){ if(u == par)continue; dfs(u,v); arr[fake[u]] = cnt-1; query.push_back({fake[u],cnt-1}); } } struct BIT{ vector<int> bit; int n; BIT(int l){ this->n = l+1; bit.assign(l+1,0); } void upd(int pos,int val){ for(;pos<n;pos+=pos&-pos){ bit[pos]+=val; } } int get(int pos){ int ret = 0; for(;pos>0;pos-=pos&-pos){ ret+=bit[pos]; } return ret; } }; void dfs2(int v,int par){ if(adj[v].size() == 1 && par!=-1){ for(auto u:nums[v])sets[v].insert(u); if((sets[v].size()-mp[{fake[v],arr[fake[v]]}])>=k){ ans.push_back(edge[{min(v,par),max(v,par)}]); } pare[v] = v; return; } int num = 0; for(auto u:adj[v]){ if(u!=par){ dfs2(u,v); if(num == 0 || sets[pare[u]].size() > sets[num].size()){ num = pare[u]; } } } for(auto u:adj[v]){ if(u!=par && pare[u]!=num){ for(auto c:sets[pare[u]]){ sets[num].insert(c); } } } for(auto u:nums[v]){ sets[num].insert(u); } if((sets[num].size()-mp[{fake[v],arr[fake[v]]}])>=k){ ans.push_back(edge[{min(v,par),max(v,par)}]); } pare[v] = num; } void solve(){ cin >> n >> m >> k; for(int i=0;i<n-1;i++){ int a,b; cin >> a >> b; edge[{min(a,b),max(a,b)}] = i+1; adj[a].push_back(b); adj[b].push_back(a); } dfs(1,-1); arr[1] = n; query.push_back({1,n}); multiset<pii> ranges; BIT bt(n); for(int i=0;i<m;i++){ int s; cin >> s; int mini =INF; int maxi = 0; for(int j=0;j<s;j++){ int a; cin >> a; nums[a].push_back(i+1); mini = min(mini,fake[a]); maxi = max(maxi,fake[a]); } ranges.insert({mini,maxi}); bt.upd(maxi,1); } sort(all(query)); for(auto u:query){ while(!ranges.empty() && ranges.begin()->ff < u.ff){ bt.upd(ranges.begin()->ss,-1); ranges.erase(ranges.begin()); } mp[u] = bt.get(u.ss); } dfs2(1,-1); cout << ans.size() << endl; sort(all(ans)); for(auto u:ans){ cout << u << " "; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); #ifdef Local freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int t=1; //cin>>t; while(t--){ solve(); } #ifdef Local cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds "; #endif }

Compilation message (stderr)

railway.cpp: In function 'void dfs2(int, int)':
railway.cpp:59:55: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   59 |         if((sets[v].size()-mp[{fake[v],arr[fake[v]]}])>=k){
      |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
railway.cpp:84:53: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   84 |     if((sets[num].size()-mp[{fake[v],arr[fake[v]]}])>=k){
      |        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
#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...