제출 #1182173

#제출 시각아이디문제언어결과실행 시간메모리
1182173skibidisigmabartuss69Long Mansion (JOI17_long_mansion)C++20
0 / 100
82 ms9916 KiB
#include <bits/stdc++.h> using namespace std; #define ll int64_t #define vi vector<int> #define vvi vector<vi> #define iter const auto& void Solve() { int n; cin >> n; vi door_key(n + 1); // 1-based door indices for (int i = 1; i < n; ++i) cin >> door_key[i]; vvi sector_keys(n + 1); // 1-based sectors for (int i = 1; i <= n; ++i) { int k; cin >> k; sector_keys[i].resize(k); for (int& key : sector_keys[i]) cin >> key; } vi left_bound(n + 1), right_bound(n + 1); { // Compute left_bound vi last_key(n + 2, 0); for (int i = 1; i <= n; ++i) { for (int key : sector_keys[i]) last_key[key] = i; if (i < n) left_bound[i] = last_key[door_key[i]]; } } { // Compute right_bound vi last_key(n + 2, n + 1); for (int i = n; i >= 1; --i) { for (int key : sector_keys[i]) last_key[key] = i; if (i > 1) right_bound[i - 1] = last_key[door_key[i - 1]]; } } vi left_reach(n + 1), right_reach(n + 1); for (int i = 1; i <= n; ++i) { left_reach[i] = right_reach[i] = i; while (true) { bool expanded = false; if (left_reach[i] > 1) { int door = left_reach[i] - 1; if (right_bound[door] <= right_reach[i]) { left_reach[i] = min(left_reach[i], left_reach[door]); right_reach[i] = max(right_reach[i], right_reach[door]); expanded = true; } } if (right_reach[i] < n && left_reach[i] <= left_bound[right_reach[i]]) { ++right_reach[i]; expanded = true; } if (!expanded) break; } } int q; cin >> q; while (q--) { int s, t; cin >> s >> t; cout << (left_reach[s] <= t && t <= right_reach[s] ? "TAK\n" : "NIE\n"); } } int main() { cin.tie(0)->sync_with_stdio(0); Solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...