제출 #1358041

#제출 시각아이디문제언어결과실행 시간메모리
1358041guguguggugBitaro’s Party (JOI18_bitaro)C++20
14 / 100
1202 ms414464 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 

void dbg(){cout<<"\033[0m";}
template<typename T,typename... args>
void dbg(T f,args... a){cout<<"\033[95m"<<f;dbg(a...);}
#define dbg(...)

int n,m,q;
const int K = 250;
vector<int> back[(int)1e5+5];
int dp[(int)1e5+5];

// store up to K longest path to any node.
vector<pair<int,int>> path[(int)1e5+5];

void add(const pair<int,int> &x,vector<pair<int,int>> &V){
    auto it = lower_bound(V.begin(),V.end(),x,greater<pair<int,int>>());
    if(it != V.end() && *it == x)return;
    V.insert(it,x);
    if(V.size() > K)V.resize(K);
}

signed main(){
    cin>>n>>m>>q;
    for(int i=1;i<=m;i++){
        int u,v;cin>>u>>v;
        back[v].push_back(u);
    }
    for(int i=1;i<=n;i++){
        add({0ll,i},path[i]);
        for(int v:back[i]){
            for(auto g:path[v]){
                add({g.first+1,g.second},path[i]);
            }
        }
    }

    for(int i=1;i<=n;i++){
        dbg(i," : \n");
        for(auto g:path[i])dbg(g.first,' ',g.second,"\n");
    }

    while(q--){
        int T,Y;cin>>T>>Y;
        set<int> NO;
        for(int i=1;i<=Y;i++){
            int x;cin>>x;NO.insert(x);
        }
        int ans = -1;
        if(Y>=K){
            for(int i=1;i<=T;i++){
                int ok = (NO.find(i) == NO.end());
                dp[i] = -1 + ok;
                for(int v:back[i]){
                    if(dp[v] != -1)dp[i] = max(dp[i],dp[v]+1);
                }
            }
            ans = dp[T];
        }
        else{
            for(auto x:path[T]){
                if(NO.find(x.second) == NO.end()){
                    ans = x.first;
                    break;
                }
            }
        }
        cout<<ans<<'\n';
    }

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…