Submission #414358

#TimeUsernameProblemLanguageResultExecution timeMemory
414358Runtime_error_Bitaro’s Party (JOI18_bitaro)C++14
100 / 100
1680 ms427488 KiB

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
using namespace std;
const int inf = 2e5+9,sqr = 300,MX = 1e9+9;
int n,m,q,ts,vis[inf],dis[inf];
vector<int> out[inf],in[inf],blocked;
vector<pair<int,int> >furthest[inf];

vector<pair<int,int>> merge(vector<pair<int,int>> a,vector<pair<int,int>> b){
    ts++;
    vector<pair<int,int> > ret;
    int sza = a.size(),szb = b.size(),pta = 0,ptb = 0;
    for(auto &o:a)
        o.first--;
    auto add = [&](pair<int,int> x){
        x.first ++;
        ret.pb(x);
        vis[x.second] = ts;
    };
    auto validpta = [&](){
        while(pta < sza && vis[ a[pta].second ] == ts)
            pta++;
        return pta < sza;
    };
    auto validptb = [&](){
        while(ptb < szb && vis[ b[ptb].second ] == ts)
            ptb++;
        return ptb < szb;
    };
    while(validpta() && validptb() && ret.size()<sqr){
        if(a[pta].first >= b[ptb].first)
            add(a[pta]);
        else
            add(b[ptb]);
    }
    while(validpta() && ret.size() < sqr){
        add(a[pta]);
    }
    while(validptb() && ret.size() < sqr){
        add(b[ptb]);
    }
    return ret;
}

int heavy(int goal){
    int ret = -1;

    for(int i=1;i<=n;i++)
        dis[i] = -MX;
    dis[goal] = 0;
    ts++;
    for(auto o:blocked)
        vis[o] = ts;

    for(int u=goal;u>=1;u--){
        for(auto v:out[u])
            dis[u] = max(dis[u],dis[v]+1);
        if(vis[u] != ts)
            ret = max(ret,dis[u]);
    }
    return ret;
}

int light(int goal){
    //return heavy(goal);
    int ret = -1;
    ts++;
    for(auto o:blocked)
        vis[o] = ts;
    for(auto o:furthest[goal])
        if(vis[o.second] != ts)
            ret = max(ret,o.first);
    return ret;
}

int main(){
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=m;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        out[a].pb(b);
        in[b].pb(a);
    }
    for(int u=1;u<=n;u++){
        furthest[u].pb(mp(0,u));
        for(auto v:in[u])
            furthest[u] = merge(furthest[u],furthest[v]);
    }
    while(q--){
        blocked.clear();
        int u,cnt,tmp;
        scanf("%d%d",&u,&cnt);
        for(int i=0;i<cnt;i++)
            scanf("%d",&tmp),blocked.pb(tmp);
        if(cnt >= sqr)
            printf("%d\n",heavy(u));
        else
            printf("%d\n",light(u));
    }
}
/*
5 6 3
1 2
2 4
3 4
1 3
3 5
4 5
5 2 2 3
*/

Compilation message (stderr)

bitaro.cpp: In function 'int main()':
bitaro.cpp:79:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |     scanf("%d%d%d",&n,&m,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp:82:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |         scanf("%d%d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~
bitaro.cpp:94:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |         scanf("%d%d",&u,&cnt);
      |         ~~~~~^~~~~~~~~~~~~~~~
bitaro.cpp:96:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |             scanf("%d",&tmp),blocked.pb(tmp);
      |             ~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...