Submission #245098

#TimeUsernameProblemLanguageResultExecution timeMemory
245098m3r8Railway (BOI17_railway)C++14
0 / 100
1098 ms49484 KiB
#include <stdio.h>
#include <set>
#include <vector>


#define N 100100

std::vector<int> adj[N];
std::vector<int> lll[N];
int num[N];
std::vector<int> erg;
std::set<int> avi[N];
std::vector<int> st[N];
std::vector<int> en[N];

int cnt = 1;
int k;
int in[N];
int out[N];
int pre[N][20];

int bef(int v, int u){
  if(v == 0)return 1;
  if(u == 0)return 0;
  return in[v] < in[u] && out[v] > in[u];
};

int lca(int v, int u){
  if(bef(v,u))return v;  
  if(bef(u,v))return u;  
  int akt = v;

  for(int i = 19;i>=0;i--){
    if(!bef(pre[akt][i],u)){
      akt = pre[akt][i];  
    };
  };
  return pre[akt][0];
};

void dfs(int v, int p){
  in[v] = cnt++;
  pre[v][0] = p;
  for(int i = 1;i<20;i++){
    pre[v][i] = pre[pre[v][i-1]][i-1];  
  };

  for(int i = 0;i<adj[v].size();i++){
    int u = adj[v][i];
    if(u != p){
      dfs(u,v);
    }else{
      num[v] = lll[v][i];
    };  
  };
  out[v] = cnt;
};

void solve(int v, int p){
  int mx = 0;
  int mxi = 0;
  for(int i = 0;i<adj[v].size();i++){
    int u = adj[v][i];  
    if(u != p){
      solve(u,v);  
      if(avi[u].size() > mx){
        mx = avi[u].size();  
        mxi = i;
      };
    };
  };
  if(adj[v].size() > 1)avi[v] = avi[adj[v][mxi]];
  for(int i = 0;i<adj[v].size();i++){
    int u = adj[v][i];  
    if(u != p){
      if(i != mxi){
        for(auto tmp: avi[u]){
          avi[v].insert(tmp);  
        };
      };  
    };
  };
  for(auto i: st[v])avi[v].insert(i);
  for(auto i: en[v])avi[v].erase(i);
  if(avi[v].size() >= k)erg.push_back(num[v]);
  for(auto i: adj[v]){
    if(i != p)avi[i].clear();  
  };
};

int main(void){
  int n,m;  
  scanf("%d %d %d",&n,&m,&k);
  int a,b;
  for(int i = 1;i<n;i++){
    scanf("%d %d",&a,&b);  
    adj[a].push_back(b);
    adj[b].push_back(a);
    lll[a].push_back(i);
    lll[b].push_back(i);
  };
  dfs(1,0);
  for(int i = 1;i<=m;i++){
    int cc;  
    int s;
    scanf("%d",&cc);
    int lcs = 0;
    for(int j = 0;j<cc;j++){
      scanf("%d",&s);  
      st[s].push_back(i);
      if(!lcs)lcs = s;
      else lcs = lca(lcs,s);
    };
    en[lcs].push_back(i);
  };
  /*
  for(int i = 1;i<=n;i++){
    printf("start %d: ",i);
    for(auto j: st[i])printf("%d ",j);  
    puts("");
    printf("end %d: ",i);
    for(auto j: en[i])printf("%d ",j);  
    puts("");
  };
  */
  solve(1,0);
  printf("%d\n",erg.size());
  for(int i = 0;i<erg.size();i++){
    printf("%d ",erg[i]);  
  };
  puts("");
  return 0;
};

Compilation message (stderr)

railway.cpp: In function 'void dfs(int, int)':
railway.cpp:48:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<adj[v].size();i++){
                 ~^~~~~~~~~~~~~~
railway.cpp: In function 'void solve(int, int)':
railway.cpp:62:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<adj[v].size();i++){
                 ~^~~~~~~~~~~~~~
railway.cpp:66:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(avi[u].size() > mx){
          ~~~~~~~~~~~~~~^~~~
railway.cpp:73:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<adj[v].size();i++){
                 ~^~~~~~~~~~~~~~
railway.cpp:85:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(avi[v].size() >= k)erg.push_back(num[v]);
      ~~~~~~~~~~~~~~^~~~
railway.cpp: In function 'int main()':
railway.cpp:127:27: warning: format '%d' expects argument of type 'int', but argument 2 has type 'std::vector<int>::size_type {aka long unsigned int}' [-Wformat=]
   printf("%d\n",erg.size());
                 ~~~~~~~~~~^
railway.cpp:128:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i<erg.size();i++){
                 ~^~~~~~~~~~~
railway.cpp:93:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d",&n,&m,&k);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~
railway.cpp:96:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&a,&b);  
     ~~~~~^~~~~~~~~~~~~~~
railway.cpp:106:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&cc);
     ~~~~~^~~~~~~~~~
railway.cpp:109:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d",&s);  
       ~~~~~^~~~~~~~~
#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...