Submission #1281538

#TimeUsernameProblemLanguageResultExecution timeMemory
1281538quanduongxuan12Bitaro’s Party (JOI18_bitaro)C++20
100 / 100
607 ms143488 KiB
#include <bits/stdc++.h> using namespace std; #define name "bitaro_parties" #define MAXN 100005 #define pb push_back #define pf push_front #define ll long long #define ii pair<int, int> #define fs first #define sc second #define ill pair<int, ll> #define lli pair<ll, int> #define llll pair<ll, ll> #define all(v) v.begin(),v.end() #define uni(v) v.erase(unique(all(v)),v.end()) #define bit(n,i) (((n)>>(i))&1) #define FOR(i,a,b) for (int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for (int i=(a),_b=(b); i>=_b; i--) #define MASK(i) (1LL<<(i)) const int INF=1e9; const int MOD=1e9+7; void add(int &u, int v){ u+=v; if (u>=MOD) u-=MOD; } void sub(int &u, int v){ u-=v; if (u<0) u+=MOD; } void minimize(int &u, int v){ u=min(u,v); } void maximize(int &u, int v){ u=max(u,v); } long long Rand(long long l, long long r){ ll tmp=0; FOR(i,1,4) tmp=((tmp<<15)^(((1<<15)-1)&rand())); return l+tmp%(r-l+1); } int n,m,q; vector<int> adj[MAXN]; vector<ii> opt[MAXN]; const int BLOCKS=100; int mark[MAXN]; int dp[MAXN]; queue<int> Q; int a[MAXN]; int calc(int r){ FOR(i,1,r) dp[i]=-INF; FOR(i,1,r){ if (mark[i]==0) dp[i]=0; for (int j:adj[i]){ maximize(dp[i],dp[j]+1); } } return (dp[r]>=0?dp[r]:-1); } int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin>>n>>m>>q; FOR(i,1,m){ int x,y; cin>>x>>y; adj[y].pb(x); } memset(mark,-1,sizeof(mark)); FOR(i,1,n){ opt[i].pb({0,i}); for (int j:adj[i]){ for (ii pairs: opt[j]){ int d=pairs.fs,u=pairs.sc; if (mark[u]>=0){ maximize(opt[i][mark[u]].fs,d+1); } else{ mark[u]=(int)opt[i].size(); opt[i].pb({d+1,u}); } } } sort(all(opt[i]),greater<ii>()); while ((int)opt[i].size()>BLOCKS){ ii tmp=opt[i].back(); mark[tmp.sc]=-1; opt[i].pop_back(); } FOR(j,0,(int)opt[i].size()-1) mark[opt[i][j].sc]=-1; } memset(mark,0,sizeof(mark)); while (q--){ int u,sz; cin>>u>>sz; FOR(i,1,sz) cin>>a[i]; FOR(i,1,sz) mark[a[i]]=1; if (sz>=BLOCKS){ cout<<calc(u)<<"\n"; } else{ int ans=-1; FOR(i,0,(int)opt[u].size()-1){ if (mark[opt[u][i].sc]==0){ ans=opt[u][i].fs; break; } } cout<<ans<<"\n"; } FOR(i,1,sz) mark[a[i]]=0; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...