Submission #1343660

#TimeUsernameProblemLanguageResultExecution timeMemory
1343660minhtienBitaro’s Party (JOI18_bitaro)C++20
100 / 100
905 ms418228 KiB
#include <bits/stdc++.h>
#define ii pair<int,int>
#define iiii pair<int,pair<int,pair<int,int>>>
#define iii pair<int,pair<int,int>>
#define fi first
#define se second
using namespace std;
const int N=1e5+6;
const int inf=1e9+7;
int n,m,q;
vector<ii>v[N];
vector<vector<int>>v1;
vector<int>v3[N];
vector<ii>v4[N];
vector<ii>v5[N];
int dp[N];
int a1[N],a2[N],a3[N];
int a4[N],a5[N];
int s;
void dfs(int s1,int pr){
    for(auto x:v[s1]){
        int node=x.fi;
        int s2=x.se;
        if(node!=pr){
            dp[node]=max(dp[node],dp[s1]+s2);
            dfs(node,s1);
        }
    }
}
vector<ii>f(vector<ii>& a,vector<ii>& b) {
    vector<ii>z1;
    int i=0,j=0;
    while(z1.size()<s && (i<a.size() || j<b.size())){
        ii z;
        if(i<a.size() && (j==b.size() || a[i].fi>=b[j].fi+1)){
            z=a[i++];
        }
        else{
            z={b[j].fi + 1, b[j].se};
            j++;
        }
        if(!a4[z.se]){
            a4[z.se] = 1;
            z1.push_back(z);
        }
    }
    for(auto &p:z1) a4[p.se]=0;
    return z1;
}
int main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    cin >>n >>m >>q;
    for(int i=1;i<=m;i++){
        int x,y;
        cin >>x >>y;
        v[x].push_back({y,1});
        v3[y].push_back(x);
    }
    s=sqrt(n);
    for(int i=1;i<=n;i++){
        v5[i].push_back({0,i});
        for(auto x:v3[i]){
            v5[i]=f(v5[i],v5[x]);
        }
    }
    for(int i=1;i<=q;i++){
        int x;
        cin >>x;
        int y;
        cin >>y;
        for(int j=1;j<=y;j++){
            cin >> a1[j];
        }
        if(y>=s){
            vector<int>v2;
            v2.push_back(i);
            v2.push_back(x);
            for(int j=1;j<=y;j++){
                v2.push_back(a1[j]);
            }
            v1.push_back(v2);
        }
        else{
            for(int j=1;j<=y;j++){
                a5[a1[j]]=1;
            }
            int tong=-1;
            for(auto x1:v5[x]){
                if(a5[x1.se]==0){
                    tong=x1.fi;
                    break;
                }
            }
            for(int j=1;j<=y;j++){
                a5[a1[j]]=0;
            }
            a3[i]=tong;
        }
    }
    for(auto x:v1){
        int s1=x[0];
        int s2=x[1];
        int tong1=-1;
        for(int j=2;j<x.size();j++){
            a2[x[j]]=1;
        }
        for(int i=1;i<=n;i++){
            dp[i]=-inf;
        }
        for(int i=1;i<=n;i++){
            if(a2[i]==0){
                dp[i]=max(dp[i],0);
            }
            for(auto x1:v[i]){
                int node=x1.fi;
                int s2=x1.se;
                if(dp[node]<dp[i]+s2){
                    dp[node]=dp[i]+s2;
                }
            }
        }
        for(int j=2;j<x.size();j++){
            a2[x[j]]=0;
        }
        tong1=max(dp[s2],tong1);
        a3[s1]=tong1;
    }
    for(int i=1;i<=q;i++){
        cout << a3[i] << "\n";
    }
    return 0;
}

/*

5 6 3
1 2
2 4
3 4
1 3
3 5
4 5
4 1 1
5 2 2 3
2 3 1 4 5



*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...