답안 #1107722

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1107722 2024-11-02T03:52:03 Z laight 열대 식물원 (Tropical Garden) (IOI11_garden) C++17
컴파일 오류
0 ms 0 KB
#include "garden.h"
  #include "gardenlib.h"
  #define pb emplace_back
  #include<bits/stdc++.h>
  using namespace std;
  vector<int>g[300005];
  vector<int> g2(600005);
  int jp=0;
  vector<int>g_rev[600005];
  bool cycle=false;
  int c;
  map<int,bool>vs;
  bool vs1[600005],vs2[600005];
  void dfs(int u,int cnt,int pp)
  {
    if(vs[u])
    {
      if(u==pp)
      {
        cycle = true;
        c = cnt;
      }
      return ;
    }
    vs[u]=true;
    assert((int) g2[u].size() <= 1);
    dfs(g2[u],cnt+1,pp);
  }
  int cnt_ans1[600005];
  int cnt_ans2[600005];

  void dfs1(int u,int cnt)
  {
    if(vs1[u]) return ;
    vs1[u] = true;
    cnt_ans1[u] = cnt;
    for(auto v:g_rev[u]) dfs1(v,cnt+1);
  }
  void dfs2(int u,int cnt)
  {
    if(vs2[u]) return ;
    vs2[u] = true;
    cnt_ans2[u] = cnt;
    for(auto v:g_rev[u]) dfs2(v,cnt+1);
  }


  void count_routes(int n, int m, int p, int R[][2], int Q, int G[])
  {
    for(int i=0;i<m;i++)
    {
      if(g[R[i][0]].size()<=2) g[R[i][0]].pb(R[i][1]);
      if(g[R[i][1]].size()<=2) g[R[i][1]].pb(R[i][0]);
    }
    for(int i=0;i<n;i++)
    {
      int v = g[i][0];
      if(i==g[v][0]) {g2[i] = v+n; g_rev[g2[i]].pb(v+n);}
      else  {g2[i] = v; g_rev[g2[i]].pb(v);}
      int vv;
      if(g[i].size()!=1) vv = g[i][1];
      else vv = g[i][0];

      if(i==g[vv][0]) {g2[i+n] = vv+n; g_rev[vv+n].pb(i+n);}
      else  {g2[i+n] = vv; g2[vv] = i+n;}
    }
    for(int i=0;i<2*n;i++)
    {
      g_rev[g2[i][0]].pb(i);
    }
    dfs(p,0,p);
    bool cycle1 = cycle;
    int c1 = c;
    cycle=false;
    vs.clear();
    dfs(n+p,0,n+p);
    vs.clear();
    bool cycle2 = cycle;
    int c2 = c;

    dfs1(p,0);
    dfs2(p+n,0);


    for(int k=0;k<Q;k++)
    {
      int d = G[k];
      int ans=0;

      for(int i=0;i<n;i++)
      {
        bool ok = 0;
        int len = d - cnt_ans1[i];
        if(len >= 0 and vs1[i]) {
        if(cycle1 and len%c1 == 0) ok = 1;
        else if(!cycle1 and len == 0) ok = 1;
        }

        len = d - cnt_ans2[i];
        if(len >= 0 and vs2[i]) {
        if(cycle2 and len%c2 == 0) ok = 1;
        else if(!cycle2 and len == 0) ok = 1;
        }

        ans += ok;
      }
      // cout << endl;
      answer(ans);
    }

  }

Compilation message

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from garden.cpp:4:
garden.cpp: In function 'void dfs(int, int, int)':
garden.cpp:26:24: error: request for member 'size' in 'g2.std::vector<int>::operator[](((std::vector<int>::size_type)u))', which is of non-class type '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'}
   26 |     assert((int) g2[u].size() <= 1);
      |                        ^~~~
garden.cpp: In function 'void count_routes(int, int, int, int (*)[2], int, int*)':
garden.cpp:69:18: error: invalid types '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type {aka int}[int]' for array subscript
   69 |       g_rev[g2[i][0]].pb(i);
      |                  ^