제출 #957473

#제출 시각아이디문제언어결과실행 시간메모리
957473n3rm1nRailway (BOI17_railway)C++17
23 / 100
422 ms524288 KiB
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int MAXN = 1e5 + 1, MAXLOG = 21;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
int n, m, k;
vector < pair < int, int > > g[MAXN];
void read_graph()
{
    cin >> n >> m >> k;
    int from, to;
    for (int i = 1; i < n; ++ i)
    {
        cin >> from >> to;
        g[from].push_back({to, i});
        g[to].push_back({from, i});
    }
}

int p[MAXN], lvl[MAXN];
void dfs(int beg, int par, int depth)
{
    p[beg] = par;
    lvl[beg] = depth;
    int nb;
    for (int i = 0; i < g[beg].size(); ++ i)
    {
        nb = g[beg][i].first;
        if(lvl[nb] == 0)dfs(nb, beg, depth+1);
    }
}
int jump[MAXN][MAXLOG];
void fill_jump()
{
    for (int i = 1; i <= n; ++ i)
        jump[i][0] = p[i];
    for (int j = 1; j < MAXLOG; ++ j)
        for (int i = 1; i <= n; ++ i)
            jump[i][j] = jump[jump[i][j-1]][j-1];
}
int move_up(int v, int dist)
{
    for (int i = 0; (1 << i) <= dist; ++ i)
    {
        if((1 << i) & dist)
            v = jump[v][i];
    }
    return v;
}
int lca(int u, int v)
{
    if(lvl[u] > lvl[v])swap(u, v);
    int diff = lvl[v] - lvl[u];
    v = move_up(v, diff);
    if(u == v)return u;
    for (int i = MAXLOG - 1; i >= 0; -- i)
    {
        if(jump[u][i] != jump[v][i])
        {
            u = jump[u][i];
            v = jump[v][i];
        }
    }
    return p[u];
}
int s;
vector < int > que;
vector < int > endpoints[MAXN], startpoints[MAXN];
int used[MAXN];
int ans[MAXN];
bitset < MAXN > dfs2(int beg)
{
    used[beg] = 1;
    /// add

    int nb, id;
    bitset < MAXN > bs, vs;
    for (int i = 0; i < g[beg].size(); ++ i)
    {
        nb = g[beg][i].first;
        id = g[beg][i].second;

        if(!used[nb])
        {
            vs = dfs2(nb);
            bs = (bs | vs);
            ans[id] += vs.count();
        }
    }
    for (int i = 0; i < endpoints[beg].size(); ++ i)
        bs[endpoints[beg][i]] = 1;
    for (int i = 0; i < startpoints[beg].size(); ++ i)
        bs[startpoints[beg][i]] = 0;
    return bs;
}
void read_queries()
{
    int xx;
    for (int i = 1; i <= m; ++ i)
    {
        cin >> s >> xx;
        int lcaa = xx;
        que.clear();
        que.push_back(xx);
        for (int j = 2; j <= s; ++ j)
        {
            cin >> xx;
            que.push_back(xx);
            lcaa = lca(lcaa, xx);
        }
        startpoints[lcaa].push_back(i);
        for (int j = 0; j < que.size(); ++ j)
        {
            endpoints[que[j]].push_back(i);
        }
    }

}
int main()
{
    speed();

    read_graph();
    dfs(1, 0, 1);
    fill_jump();
    read_queries();
    dfs2(1);


    vector < int > anss;
    for (int i = 1; i <= n; ++ i)
    {
        if(ans[i] >= k)anss.push_back(i);
    }

    cout << anss.size() << endl;
    for (int i = 0; i < anss.size(); ++ i)
        cout << anss[i] << " ";
    cout << endl;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

railway.cpp: In function 'void dfs(int, int, int)':
railway.cpp:31:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |     for (int i = 0; i < g[beg].size(); ++ i)
      |                     ~~^~~~~~~~~~~~~~~
railway.cpp: In function 'std::bitset<100001> dfs2(int)':
railway.cpp:83:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |     for (int i = 0; i < g[beg].size(); ++ i)
      |                     ~~^~~~~~~~~~~~~~~
railway.cpp:95:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for (int i = 0; i < endpoints[beg].size(); ++ i)
      |                     ~~^~~~~~~~~~~~~~~~~~~~~~~
railway.cpp:97:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |     for (int i = 0; i < startpoints[beg].size(); ++ i)
      |                     ~~^~~~~~~~~~~~~~~~~~~~~~~~~
railway.cpp: In function 'void read_queries()':
railway.cpp:117:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |         for (int j = 0; j < que.size(); ++ j)
      |                         ~~^~~~~~~~~~~~
railway.cpp: In function 'int main()':
railway.cpp:142:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  142 |     for (int i = 0; i < anss.size(); ++ i)
      |                     ~~^~~~~~~~~~~~~
#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...