제출 #711348

#제출 시각아이디문제언어결과실행 시간메모리
711348thimote75Bitaro’s Party (JOI18_bitaro)C++14
7 / 100
2065 ms453132 KiB
#include <bits/stdc++.h> using namespace std; #define idata vector<int> #define igrid vector<idata> #define di pair<int, int> int nbNodes, nbRoads, nbQuery; igrid roads; const int BLOCK_SIZE = 400; di delta[BLOCK_SIZE]; vector<int> visited; vector<int> depth_s; int stage = 1; struct VBO { set<di, greater<>> sdd; void insert (int node, int depth) { if (depth_s[node] != -1) { int max_depth = depth_s[node]; if (max_depth >= depth) return ; sdd.erase(di(max_depth, node)); } depth_s[node] = depth; sdd.insert(di(depth, node)); if (sdd.size() <= BLOCK_SIZE) return ; auto it = sdd.end(); it --; int rnode = (*it).second; int rdepth = (*it).first; depth_s[rnode] = -1; sdd.erase(di(rdepth, rnode)); } int query (vector<bool> &disabled) { for (di data : sdd) { if (disabled[data.second]) continue ; return data.first; } return -1; } void merge (VBO &other) { for (di data : other.sdd) this->insert(data.second, data.first + 1); } }; vector<VBO> vbos; vector<int> bfs_v; vector<int> dfs_v; void dfs (int node) { if (visited[node] == stage) return ; visited[node] = stage; for (int prev : roads[node]) dfs(prev); vbos[node].insert(node, 0); for (int prev : roads[node]) vbos[node].merge(vbos[prev]); for (di data: vbos[node].sdd) depth_s[data.second] = -1; } void _c_dfs (int node) { if (visited[node] == stage) return ; visited[node] = stage; for (int prev : roads[node]) { dfs_v[prev] ++; _c_dfs(prev); } } vector<bool> disabled; int _compute (int start) { queue<int> nodes; nodes.push(start); fill(dfs_v.begin(), dfs_v.end(), 0); _c_dfs(start); stage ++; fill(bfs_v.begin(), bfs_v.end(), -1); bfs_v[start] = 0; int answer = -1; while (nodes.size() != 0) { int curr = nodes.front(); nodes.pop(); if (!disabled[curr]) answer = max(answer, bfs_v[curr]); for (int prev : roads[curr]) { dfs_v[prev] --; if (dfs_v[prev] != 0) continue ; bfs_v[prev] = bfs_v[curr] + 1; nodes.push(prev); } } return answer; } int compute (int node, int c_disabled) { if (c_disabled <= BLOCK_SIZE) return vbos[node].query(disabled); return _compute(node); } int main () { cin >> nbNodes >> nbRoads >> nbQuery; vbos .resize(nbNodes); roads.resize(nbNodes); visited.resize(nbNodes); dfs_v.resize(nbNodes); bfs_v.resize(nbNodes); depth_s.resize(nbNodes, -1); disabled.resize(nbNodes, false); for (int idRoad = 0; idRoad < nbRoads; idRoad ++) { int a, b; cin >> a >> b; a --; b --; roads[b].push_back(a); } for (int idNode = 0; idNode < nbNodes; idNode ++) dfs(idNode); stage ++; for (int idQuery = 0; idQuery < nbQuery; idQuery ++) { int target, dCount; cin >> target >> dCount; target --; vector<int> d_arr; for (int idD = 0; idD < dCount; idD ++) { int vd; cin >> vd; vd --; d_arr.push_back(vd); disabled[vd] = true; } cout << compute(target, dCount) << endl; for (int i : d_arr) disabled[i] = false; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...