Submission #1282339

#TimeUsernameProblemLanguageResultExecution timeMemory
1282339escobrandRailway (BOI17_railway)C++20
100 / 100
64 ms26988 KiB
#include <bits/stdc++.h>

using namespace std;
#define fi first
#define se second
#define ll long long
#define all(v) v.begin(),v.end()
#define mk make_pair
#define pb push_back
#define eb emplace_back
typedef pair<int,int> pii;

const int maxn = 1e5 + 10;
int i,n,m,t;
vector<pii> adj[maxn];
int in[maxn],out[maxn],p[maxn][20],req;

void dfs(int i,int pa)
{
  in[i] = ++t;
  p[i][0] = pa;
  for(int j = 1;j<20;j++)p[i][j] = p[p[i][j-1]][j-1];
  for(pii k : adj[i])
  {
      if(k.fi==pa)continue;
    dfs(k.fi,i);
  }
  out[i] = t;
}

bool cmp(int &i,int &j)
{
  return in[i] < in[j];
}

void filter(vector <int>& v)
{
    sort(all(v),cmp);
    v.resize(unique(all(v))-v.begin());
}

int lca(int u,int v)
{
    if(!cmp(u,v))swap(u,v);
    if(u==v)return u;
    for(int j = 19;j>=0;j--)
    {
        if(p[v][j] && cmp(u,p[v][j]))v = p[v][j];
    }
    return p[v][0];
}
int dp[maxn];

void solve()
{
    int n;
    cin>>n;
    vector<int>v(n);
    for(int &k : v)cin>>k;
    filter(v);
    for(int i = 1;i<n;i++)
    {
        v.pb(lca(v[i],v[i-1]));
    }
    filter(v);
    stack<int>st;
    for(int k : v)
    {
        while(st.size() && out[k]>out[st.top()])st.pop();
        if(st.size())
        {
            dp[k]++;
            dp[st.top()]--;
        }
        st.push(k);
    }
}
vector<int>ans;
void cal(int i,int pa)
{
    for(pii k : adj[i])
    {
        if(k.fi==pa)continue;
        cal(k.fi,i);
        if(dp[k.fi]>=req)ans.pb(k.se);
        dp[i] += dp[k.fi];
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    if(fopen("a.inp","r"))
    {
        freopen("a.inp","r",stdin);
        freopen("a.out","w",stdout);
    }


    cin>>n>>m>>req;

    for(i =1;i<n;i++)
    {
      int u,v;
      cin>>u>>v;
      adj[u].pb(mk(v,i));
      adj[v].pb(mk(u,i));
    }
    dfs(1,0);
    while(m--)
    {
        solve();
    }

    cal(1,0);
    sort(all(ans));
    cout<<ans.size()<<'\n';
    for(int k : ans)cout<<k<<' ';


    return 0;
}

Compilation message (stderr)

railway.cpp: In function 'int main()':
railway.cpp:97:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         freopen("a.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~
railway.cpp:98:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |         freopen("a.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...