/**
Solution:
Idea: We can precompute for each node the sqrt(n) furthest nodes with a simple dp. Then for each query
if the number of forbidden nodes is less than sqrt(n) then for sure the answer will be among the precomputed
otherwise we can simply solve it with a brutefore since the queries of this type will be less than sqrt(n).
*/
#include <bits/stdc++.h>
const int32_t MAX_N = 1e5;
const int32_t BUCKET_SIZE = 300;
bool isInVector[MAX_N + 5];
bool isForbidden[MAX_N + 5];
std::vector< std::pair< int32_t, int32_t > > Merge(const std::vector< std::pair< int32_t, int32_t> > &v1,
const std::vector< std::pair< int32_t, int32_t > > &v2) {
std::vector< std::pair< int32_t, int32_t > > ans;
int32_t ind1 = 0, ind2 = 0;
while((ind1 < v1.size() || ind2 < v2.size()) && ans.size() < BUCKET_SIZE) {
if(ind1 < v1.size()) {
if(ind2 < v2.size()) {
if(v1[ind1].first >= v2[ind2].first + 1) {
if(!isInVector[v1[ind1].second]) {
isInVector[v1[ind1].second] = true;
ans.push_back(v1[ind1]);
}
ind1++;
}
else {
if(!isInVector[v2[ind2].second]) {
isInVector[v2[ind2].second] = true;
ans.push_back({ v2[ind2].first + 1, v2[ind2].second });
}
ind2++;
}
}
else {
if(!isInVector[v1[ind1].second]) {
isInVector[v1[ind1].second] = true;
ans.push_back(v1[ind1]);
}
ind1++;
}
}
else {
if(!isInVector[v2[ind2].second]) {
isInVector[v2[ind2].second] = true;
ans.push_back({ v2[ind2].first + 1, v2[ind2].second });
}
ind2++;
}
}
for(auto &x : ans) {
isInVector[x.second] = false;
}
return ans;
}
class Graph {
private:
struct Node {
int32_t id;
std::vector< std::pair< int32_t, int32_t > > dp;
std::vector< Node* > v, rev;
};
int32_t cntNodes;
Node nodes[MAX_N + 5];
public:
void Init(int32_t _cntNodes) {
cntNodes = _cntNodes;
for(int32_t i = 1; i <= cntNodes; i++) {
nodes[i].id = i;
}
}
void AddEdge(int32_t from, int32_t to) {
nodes[from].v.push_back(&nodes[to]);
nodes[to].rev.push_back(&nodes[from]);
}
void Precompute() {
for(int32_t i = 1; i <= cntNodes; i++) {
std::vector< std::pair< int32_t, int32_t > > dists;
nodes[i].dp.push_back({ 0, i });
for(auto &x : nodes[i].v) {
nodes[i].dp = Merge(nodes[i].dp, x->dp);
}
}
}
int32_t SolveSmallK(int32_t t) {
for(auto &x : nodes[t].dp) {
if(!isForbidden[x.second]) {
return x.first;
}
}
return -1;
}
int32_t SolveBigK(int32_t t) {
std::vector< int32_t > dp(t + 1, 0);
int32_t ans = (isForbidden[t] ? -1 : 0);
for(int32_t i = t - 1; i >= 1; i--) {
bool isChanged = false;
for(auto &x : nodes[i].rev) {
if(x->id <= t && (x->id == t || dp[x->id] != 0)) {
dp[i] = std::max(dp[i], dp[x->id] + 1);
isChanged = true;
}
}
if(isChanged && !isForbidden[i]) {
ans = std::max(ans, dp[i]);
}
}
return ans;
}
};
Graph g;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int32_t n, m, q;
std::cin >> n >> m >> q;
g.Init(n);
for(int32_t i = 0; i < m; i++) {
int32_t u, v;
std::cin >> u >> v;
g.AddEdge(v, u);
}
g.Precompute();
for(int32_t i = 0; i < q; i++) {
int32_t t, k;
std::cin >> t >> k;
std::vector< int32_t > c(k);
for(int32_t j = 0; j < k; j++) {
std::cin >> c[j];
isForbidden[c[j]] = true;
}
if(k >= BUCKET_SIZE) {
std::cout << g.SolveBigK(t) << '\n';
}
else {
std::cout << g.SolveSmallK(t) << '\n';
}
for(int32_t j = 0; j < k; j++) {
isForbidden[c[j]] = false;
}
}
}
Compilation message
bitaro.cpp: In function 'std::vector<std::pair<int, int> > Merge(const std::vector<std::pair<int, int> >&, const std::vector<std::pair<int, int> >&)':
bitaro.cpp:20:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while((ind1 < v1.size() || ind2 < v2.size()) && ans.size() < BUCKET_SIZE) {
~~~~~^~~~~~~~~~~
bitaro.cpp:20:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while((ind1 < v1.size() || ind2 < v2.size()) && ans.size() < BUCKET_SIZE) {
~~~~~^~~~~~~~~~~
bitaro.cpp:21:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(ind1 < v1.size()) {
~~~~~^~~~~~~~~~~
bitaro.cpp:22:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(ind2 < v2.size()) {
~~~~~^~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
8184 KB |
Output is correct |
2 |
Correct |
10 ms |
8316 KB |
Output is correct |
3 |
Correct |
11 ms |
8316 KB |
Output is correct |
4 |
Correct |
10 ms |
8332 KB |
Output is correct |
5 |
Correct |
13 ms |
8848 KB |
Output is correct |
6 |
Correct |
13 ms |
8896 KB |
Output is correct |
7 |
Correct |
13 ms |
9020 KB |
Output is correct |
8 |
Correct |
23 ms |
11856 KB |
Output is correct |
9 |
Correct |
25 ms |
11856 KB |
Output is correct |
10 |
Correct |
22 ms |
11868 KB |
Output is correct |
11 |
Correct |
25 ms |
11868 KB |
Output is correct |
12 |
Correct |
17 ms |
11868 KB |
Output is correct |
13 |
Correct |
25 ms |
11868 KB |
Output is correct |
14 |
Correct |
23 ms |
11868 KB |
Output is correct |
15 |
Correct |
17 ms |
11868 KB |
Output is correct |
16 |
Correct |
17 ms |
11868 KB |
Output is correct |
17 |
Correct |
20 ms |
11868 KB |
Output is correct |
18 |
Correct |
16 ms |
11868 KB |
Output is correct |
19 |
Correct |
20 ms |
11868 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
8184 KB |
Output is correct |
2 |
Correct |
10 ms |
8316 KB |
Output is correct |
3 |
Correct |
11 ms |
8316 KB |
Output is correct |
4 |
Correct |
10 ms |
8332 KB |
Output is correct |
5 |
Correct |
13 ms |
8848 KB |
Output is correct |
6 |
Correct |
13 ms |
8896 KB |
Output is correct |
7 |
Correct |
13 ms |
9020 KB |
Output is correct |
8 |
Correct |
23 ms |
11856 KB |
Output is correct |
9 |
Correct |
25 ms |
11856 KB |
Output is correct |
10 |
Correct |
22 ms |
11868 KB |
Output is correct |
11 |
Correct |
25 ms |
11868 KB |
Output is correct |
12 |
Correct |
17 ms |
11868 KB |
Output is correct |
13 |
Correct |
25 ms |
11868 KB |
Output is correct |
14 |
Correct |
23 ms |
11868 KB |
Output is correct |
15 |
Correct |
17 ms |
11868 KB |
Output is correct |
16 |
Correct |
17 ms |
11868 KB |
Output is correct |
17 |
Correct |
20 ms |
11868 KB |
Output is correct |
18 |
Correct |
16 ms |
11868 KB |
Output is correct |
19 |
Correct |
20 ms |
11868 KB |
Output is correct |
20 |
Correct |
715 ms |
16168 KB |
Output is correct |
21 |
Correct |
641 ms |
16332 KB |
Output is correct |
22 |
Correct |
729 ms |
16332 KB |
Output is correct |
23 |
Correct |
755 ms |
16392 KB |
Output is correct |
24 |
Correct |
1476 ms |
259296 KB |
Output is correct |
25 |
Correct |
1534 ms |
270832 KB |
Output is correct |
26 |
Correct |
1434 ms |
270832 KB |
Output is correct |
27 |
Correct |
1465 ms |
419180 KB |
Output is correct |
28 |
Correct |
1449 ms |
419308 KB |
Output is correct |
29 |
Correct |
1491 ms |
419436 KB |
Output is correct |
30 |
Correct |
1566 ms |
419436 KB |
Output is correct |
31 |
Correct |
1781 ms |
419436 KB |
Output is correct |
32 |
Correct |
1473 ms |
419436 KB |
Output is correct |
33 |
Correct |
1131 ms |
419436 KB |
Output is correct |
34 |
Correct |
1051 ms |
419436 KB |
Output is correct |
35 |
Correct |
1173 ms |
419436 KB |
Output is correct |
36 |
Correct |
1439 ms |
419436 KB |
Output is correct |
37 |
Correct |
1464 ms |
419436 KB |
Output is correct |
38 |
Correct |
1488 ms |
419436 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
8184 KB |
Output is correct |
2 |
Correct |
10 ms |
8316 KB |
Output is correct |
3 |
Correct |
11 ms |
8316 KB |
Output is correct |
4 |
Correct |
10 ms |
8332 KB |
Output is correct |
5 |
Correct |
13 ms |
8848 KB |
Output is correct |
6 |
Correct |
13 ms |
8896 KB |
Output is correct |
7 |
Correct |
13 ms |
9020 KB |
Output is correct |
8 |
Correct |
23 ms |
11856 KB |
Output is correct |
9 |
Correct |
25 ms |
11856 KB |
Output is correct |
10 |
Correct |
22 ms |
11868 KB |
Output is correct |
11 |
Correct |
25 ms |
11868 KB |
Output is correct |
12 |
Correct |
17 ms |
11868 KB |
Output is correct |
13 |
Correct |
25 ms |
11868 KB |
Output is correct |
14 |
Correct |
23 ms |
11868 KB |
Output is correct |
15 |
Correct |
17 ms |
11868 KB |
Output is correct |
16 |
Correct |
17 ms |
11868 KB |
Output is correct |
17 |
Correct |
20 ms |
11868 KB |
Output is correct |
18 |
Correct |
16 ms |
11868 KB |
Output is correct |
19 |
Correct |
20 ms |
11868 KB |
Output is correct |
20 |
Correct |
715 ms |
16168 KB |
Output is correct |
21 |
Correct |
641 ms |
16332 KB |
Output is correct |
22 |
Correct |
729 ms |
16332 KB |
Output is correct |
23 |
Correct |
755 ms |
16392 KB |
Output is correct |
24 |
Correct |
1476 ms |
259296 KB |
Output is correct |
25 |
Correct |
1534 ms |
270832 KB |
Output is correct |
26 |
Correct |
1434 ms |
270832 KB |
Output is correct |
27 |
Correct |
1465 ms |
419180 KB |
Output is correct |
28 |
Correct |
1449 ms |
419308 KB |
Output is correct |
29 |
Correct |
1491 ms |
419436 KB |
Output is correct |
30 |
Correct |
1566 ms |
419436 KB |
Output is correct |
31 |
Correct |
1781 ms |
419436 KB |
Output is correct |
32 |
Correct |
1473 ms |
419436 KB |
Output is correct |
33 |
Correct |
1131 ms |
419436 KB |
Output is correct |
34 |
Correct |
1051 ms |
419436 KB |
Output is correct |
35 |
Correct |
1173 ms |
419436 KB |
Output is correct |
36 |
Correct |
1439 ms |
419436 KB |
Output is correct |
37 |
Correct |
1464 ms |
419436 KB |
Output is correct |
38 |
Correct |
1488 ms |
419436 KB |
Output is correct |
39 |
Correct |
1712 ms |
419436 KB |
Output is correct |
40 |
Correct |
1634 ms |
419436 KB |
Output is correct |
41 |
Correct |
1677 ms |
419436 KB |
Output is correct |
42 |
Execution timed out |
2093 ms |
419436 KB |
Time limit exceeded |
43 |
Halted |
0 ms |
0 KB |
- |