Submission #1300519

#TimeUsernameProblemLanguageResultExecution timeMemory
1300519hihihihawBitaro’s Party (JOI18_bitaro)C++20
14 / 100
1369 ms124456 KiB
#pragma GCC optimize("O3,unroll-loops,fast-math")    
#include <bits/stdc++.h>
using namespace std;
 
//#define int long long
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define sz(v) (int)v.size()
#define fi first
#define se second
#define INF 122337203
#define INF2 122337203
#define MOD 998244353
#define cint(x) int x;cin>>x;
#define cinarr(a,n) int a[n];for (int i=0;i<n;i++) cin>>a[i];
#define coutarr(a) for (auto d:a)cout<<d<<" "; cout<<endl;
#define coutarrD(a) for (auto d:a) cout<<d.fi<<","<<d.se<<" "; cout<<endl;
#define BERKAY_TUP ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define endl '\n'
#define ld long double
#define mid (start+end)/2
#define vvi vector<vector<int>>
int t=1;
int interactive=0;
int usaco=0;
int testCase=0;
const int B=125;
vector<int> edges[100023];
vector<int> edgesR[100023];
vector<pii> v[100023];
bool taken[100023];
bool seen[100023];
int dp[100023];
bool blokd[100023];
int ans;
void dfsC(int x){
    if (seen[x]) return;
    seen[x]=true;
    for (int d:edgesR[x]){
        dfsC(d);
    }
    vector<int> c(sz(edgesR[x]));
    int mx=-1,mxV=0;
    for (int i=0;i<B;i++){
        mx=-1;
        mxV=0;
        if (0>mx){
            mx=0;
            mxV=x;
        }
        for (int j=0;j<sz(edgesR[x]);j++){
            auto k=v[edgesR[x][j]];
            //if (x==3) coutarrD(k);
            //cout<<"*"<<k[c[j]].fi<<taken[k[c[j]].fi]<<c[j]<<endl;
            while (c[j]!=sz(k) && taken[k[c[j]].fi]){
                c[j]++;
            }
            if (c[j]!=sz(k)){
                if (k[c[j]].se+1>mx){
                    mx=k[c[j]].se+1;
                    mxV=k[c[j]].fi;
                    c[j]++;
                }
            }
        }
        if (mxV==0) break;
        if (mx==0){
            v[x].pb({mxV,mx});
            break;
        }
        v[x].pb({mxV,mx});
        taken[mxV]=true;
    }
    for (auto d:v[x]){
        taken[d.fi]=false;
    }
    //cout<<x<<endl;
    //coutarrD(v[x]);
    
}
int g;
void dfs(int x){
    if (seen[x]) return;
    seen[x]=true;
    int mx=-INF;
    for (int d:edges[x]){
        dfs(d);
        mx=max(mx,dp[d]);
    }
    if (x==g){
        dp[x]=0;
        if (!blokd[x]) ans=max(ans,0);
        return;
    }
    dp[x]=mx+1;
    if (!blokd[x])ans=max(ans,dp[x]);
}
void solve(){
    int n,m,q;
    cin>>n>>m>>q;
    for (int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        edges[x].pb(y);
        edgesR[y].pb(x);
    }
    for (int i=1;i<=n;i++) dfsC(i);
    while (q--){
        int h,y;
        cin>>h>>y;
        g=h;
        cinarr(bl,y);
        for (auto d:bl) blokd[d]=true;
        ans=-INF;
        if (y<B){
            for (auto d:v[g]){
                if (!blokd[d.fi]) ans=max(ans,d.se);
            }
            if (ans<0) cout<<-1<<endl;
            else cout<<ans<<endl;
        }
        else{
            for (int i=1;i<=n;i++) seen[i]=false;
            for (int i=1;i<=n;i++) dfs(i);
            if (ans<0) cout<<-1<<endl;
            else cout<<ans<<endl;
        }
        for (auto d:bl) blokd[d]=false;
    }
    
    

}

 
 
 
 
 
 

 
int32_t main(){
    BERKAY_TUP;
    if (usaco){
        freopen("team.in", "r", stdin);
        freopen("team.out", "w", stdout);
    }
    if (!interactive){
    #ifdef Local
        freopen("in.txt", "r", stdin);
        freopen("out2.txt", "w", stdout);
        //freopen("wormsort.out", "w", stdout);
    #endif
    }
    if (t==1) solve();
    else{
        cin>>t;
        while (t--){testCase++;solve();}
    }
    
        
    return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'int32_t main()':
bitaro.cpp:147:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  147 |         freopen("team.in", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:148:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |         freopen("team.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...