Submission #44887

#TimeUsernameProblemLanguageResultExecution timeMemory
44887RayaBurong25_1Bitaro’s Party (JOI18_bitaro)C++17
14 / 100
2075 ms14292 KiB
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#define INF 1000000007
std::vector<int> AdjList[100005];
int Seg[400005];
typedef struct query query;
struct query
{
    int i, T;
    std::vector<int> Y;
};
std::vector<query> Queries;
int compare(query a, query b)
{
    return (a.T < b.T);
}
int Ans[100005];
int Out[100005];
std::vector<int> Topo;
int Pos[100005];
int Longest[100005];
int Vis[100005], cnt;
int N;
int max(int a, int b)
{
    return (a > b)?a:b;
}
void makeTree(int s, int e, int cell)
{
    if (s == e)
    {
        Seg[cell] = Longest[s];
        return;
    }
    int m = (s + e)/2;
    makeTree(s, m, 2*cell + 1);
    makeTree(m + 1, e, 2*cell + 2);
    Seg[cell] = max(Seg[2*cell + 1], Seg[2*cell + 2]);
}
void explore(int pos)
{
    // printf("explore %d (%d): ", pos, Topo[pos]);
    cnt++;
    Longest[Topo[pos]] = 0;
    Vis[Topo[pos]] = cnt;
    int i, u;
    while (pos < N)
    {
        u = Topo[pos];
        // printf("u%d\n", u);
        if (Vis[u] < cnt)
        {
            Vis[u] = cnt;
            Longest[u] = -INF;
        }
        for (i = 0; i < AdjList[u].size(); i++)
        {
            // printf("  v%d\n", AdjList[u][i]);
            if (Vis[AdjList[u][i]] < cnt)
            {
                Vis[AdjList[u][i]] = cnt;
                Longest[AdjList[u][i]] = Longest[u] + 1;
            }
            else if (Longest[u] + 1 > Longest[AdjList[u][i]])
            {
                Longest[AdjList[u][i]] = Longest[u] + 1;
            }
        }
        pos++;
    }
    for (i = 1; i <= N; i++)
    {
        if (Vis[i] < cnt)
        {
            Vis[i] = cnt;
            Longest[i] = -INF;
        }
        // printf("%d ", Longest[i]);
    }
    // printf("\n");
    makeTree(1, N, 0);
}
void update(int p, int v, int s, int e, int cell)
{
    if (s == e)
    {
        Seg[cell] = v;
        return;
    }
    int m = (s + e)/2;
    if (p <= m)
        update(p, v, s, m, 2*cell + 1);
    else
        update(p, v, m + 1, e, 2*cell + 2);
    Seg[cell] = max(Seg[2*cell + 1], Seg[2*cell + 2]);
}
int answer(int q)
{
    int i;
    for (i = 0; i < Queries[q].Y.size(); i++)
        update(Queries[q].Y[i], -INF, 1, N, 0);
    int r = Seg[0];
    for (i = 0; i < Queries[q].Y.size(); i++)
        update(Queries[q].Y[i], Longest[Queries[q].Y[i]], 1, N, 0);
    if (r < 0)
        return -1;
    else
        return r;
}
int main()
{
    int M, Q;
    scanf("%d %d %d", &N, &M, &Q);
    int i, u, v;
    for (i = 0; i < M; i++)
    {
        scanf("%d %d", &u, &v);
        AdjList[v].push_back(u);
        Out[u]++;
    }
    std::queue<int> Qu;
    for (i = 1; i <= N; i++)
        if (Out[i] == 0)
            Qu.push(i);
    while (!Qu.empty())
    {
        u = Qu.front();
        Qu.pop();
        Pos[u] = Topo.size();
        Topo.push_back(u);

        for (i = 0; i < AdjList[u].size(); i++)
        {
            Out[AdjList[u][i]]--;
            if (Out[AdjList[u][i]] == 0)
                Qu.push(AdjList[u][i]);
        }
    }
    // printf("Topo: ");
    // for (i = 0; i < Topo.size(); i++)
        // printf("%d ", Topo[i]);
    // printf("\n");
    int T, Y, j, y;
    query p;
    for (i = 0; i < Q; i++)
    {
        scanf("%d %d", &T, &Y);
        p.i = i;
        p.T = T;
        p.Y.clear();
        for (j = 0; j < Y; j++)
        {
            scanf("%d", &y);
            p.Y.push_back(y);
        }
        Queries.push_back(p);
    }
    std::sort(Queries.begin(), Queries.end(), compare);
    for (i = 0; i < Q; i++)
    {
        if (i == 0 || Queries[i].T != Queries[i - 1].T)
        {
            explore(Pos[Queries[i].T]);
        }
        Ans[Queries[i].i] = answer(i);
    }
    for (i = 0; i < Q; i++)
        printf("%d\n", Ans[i]);
}

Compilation message (stderr)

bitaro.cpp: In function 'void explore(int)':
bitaro.cpp:58:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0; i < AdjList[u].size(); i++)
                     ~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp: In function 'int answer(int)':
bitaro.cpp:102:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < Queries[q].Y.size(); i++)
                 ~~^~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:105:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < Queries[q].Y.size(); i++)
                 ~~^~~~~~~~~~~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:134:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0; i < AdjList[u].size(); i++)
                     ~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp:115:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &N, &M, &Q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:119:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &u, &v);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:149:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &T, &Y);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:155:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &y);
             ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...