Submission #692109

#TimeUsernameProblemLanguageResultExecution timeMemory
692109BJMinhNhutBitaro’s Party (JOI18_bitaro)C++14
14 / 100
2050 ms399668 KiB
// Created by BJMinhNhut #include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back #define fi first #define se second #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 ALL(a) (a).begin(), (a).end() #define RALL(a) (a).rbegin(), (a).rend() #define MASK(i) (1ll<<(i)) #define BIT(t, i) (((t)>>(i))&1) typedef long long ll; typedef vector<int> vi; typedef vector<ll> vll; typedef pair<ll, ll> pll; typedef pair<int, int> ii; /***Common Functions***/ template <class T> bool minimize(T &a, T b) { if (a > b) { a = b; return true; } return false; } template <class T> bool maximize(T &a, T b) { if (a < b) { a = b; return true; } return false; } template<class T> void read(T &a) { a = 0; char c; while (!isdigit(c = getchar())) {} do { a = a*10 + (c-'0'); } while (isdigit(c = getchar())); } template<class T> void write(T a){ if (a > 9) write(a/10); putchar(a%10 + '0'); } /***End of Template***/ int numNodes, numEdges, numQueries; const int N = 1e5+5; vi to[N]; const int SQRT = 500; ii dp[N][SQRT]; //dp[i][j]: j-th longest path to node i int tmp[N]; bool checked[N]; void Input() { cin >> numNodes >> numEdges >> numQueries; FOR(i, 1, numEdges) { int u, v; cin >> u >> v; to[u].pb(v); } } void update(int cur, int nxt) { vector<ii> tmp(0); tmp.reserve(SQRT); int i = 0, j = 0; while (tmp.size() < SQRT) { if (i == SQRT) tmp.pb(make_pair(dp[cur][j].first >= 0 ? dp[cur][j].first+1 : dp[cur][j].first, dp[cur][j].second)), ++j; else if (j == SQRT) tmp.pb(dp[nxt][i]), ++i; else { ii nxtdp = dp[nxt][i], curdp = mp(dp[cur][j].first >= 0 ? dp[cur][j].first+1 : dp[cur][j].first, dp[cur][j].second); if (curdp < nxtdp) tmp.pb(nxtdp), ++i; else if (curdp == nxtdp) tmp.pb(nxtdp), ++i, ++j; else tmp.pb(curdp), ++j; } } for(int i = 0; i < SQRT; ++i) dp[nxt][i] = tmp[i]; } void Solve() { memset(dp, -0x3f, sizeof dp); FOR(i, 1, numNodes) dp[i][0] = make_pair(0, i); FOR(i, 1, numNodes) { for(int j : to[i]) update(i, j); } // FOR(i, 0, numNodes-1) { // cout << dp[3][i].first << ' ' << dp[3][i].second << '\n'; // } memset(checked, 0, sizeof checked); while (numQueries--) { int target; cin >> target; int absence; cin >> absence; if (absence < SQRT) { vi abslist(0); while (absence--) { int u; cin >> u; checked[u] = true; abslist.pb(u); } int best = 0; while (dp[target][best].second >= 1 && checked[dp[target][best].second]) ++best; cout << max(-1, dp[target][best].first) << '\n'; for(int u : abslist) checked[u] = false; } else { FOR(i, 1, target) tmp[i] = 0; while (absence--) { int u; cin >> u; tmp[u] = -1e9; } FOR(i, 1, target) if (tmp[i] >= 0) for(int j : to[i]) maximize(tmp[j], tmp[i] + 1); cout << max(-1, tmp[target]) << '\n'; } } } int main() { ios::sync_with_stdio(0); cin.tie(0); if (fopen("inputf.in", "r")) freopen("inputf.in", "r", stdin); Input(), Solve(); return 0; }

Compilation message (stderr)

bitaro.cpp: In function 'int main()':
bitaro.cpp:131:38: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |  if (fopen("inputf.in", "r")) freopen("inputf.in", "r", stdin);
      |                               ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...