답안 #1000476

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1000476 2024-06-17T14:47:24 Z onbert Jail (JOI22_jail) C++17
5 / 100
1202 ms 285952 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long

void add(vector<pair<int,int>> &v, pair<int,int> x) {
    if (v.size() > 0 && x.second+1 == v.back().first) v.back().first = x.first;
    else v.push_back(x);
}

const int maxn = 120005, maxN = 500005, lgn = 20, INF = 1e18;
int n, m;
vector<int> ADJ[maxn], adj[maxn];
pair<int,int> a[maxn];
int sz[maxn], fa[maxn], d[maxn], newid[maxn], lim[maxn], cnter = 0;

bool cmp(int x, int y) {
    return sz[x] < sz[y];
}

void dfs1(int u) {
    sz[u] = 1;
    int f = -1;
    for (int v:ADJ[u]) {
        if (sz[v]) {
            f = v;
            continue;
        }
        dfs1(v);
        sz[u] += sz[v];
    }
    if (f!=-1) ADJ[u].erase(find(ADJ[u].begin(), ADJ[u].end(), f));
    sort(ADJ[u].begin(), ADJ[u].end(), cmp);
}
void dfs2(int u) {
    cnter++;
    newid[u] = cnter;
    for (int v:ADJ[u]) {
        d[cnter+1] = d[newid[u]] + 1;
        dfs2(v);
        fa[newid[v]] = newid[u];
    }
    lim[newid[u]] = cnter;
}
pair<int, vector<pair<int,int>>> binlift[maxn][lgn];
void dfs3(int u) {
    for (int i=1;i<lgn;i++) {
        if (binlift[u][i-1].first==-1 || binlift[binlift[u][i-1].first][i-1].first==-1) break;
        binlift[u][i].first = binlift[binlift[u][i-1].first][i-1].first;
        binlift[u][i].second = binlift[u][i-1].second;
        for (auto [L, R]:binlift[binlift[u][i-1].first][i-1].second) add(binlift[u][i].second, {L, R});
    }
    for (int v:adj[u]) {
        binlift[v][0] = {u, {{u, u}}};
        dfs3(v);
    }
}
vector<pair<int,int>> PATH(int u, int v) {
    if (d[u] > d[v]) swap(u, v);
    vector<pair<int,int>> U = {{u, u}}, V = {{v, v}};
    for (int i=lgn-1;i>=0;i--) if (d[v] - (1<<i) >= d[u]) {
        for (auto [L, R]:binlift[v][i].second) add(V, {L, R});
        v = binlift[v][i].first;
    }
    if (u==v) return V;
    for (int i=lgn-1;i>=0;i--) if (binlift[u][i].first != binlift[v][i].first) {
        for (auto [L, R]:binlift[u][i].second) add(U, {L, R});
        u = binlift[u][i].first;
        for (auto [L, R]:binlift[v][i].second) add(V, {L, R});
        v = binlift[v][i].first;
    }
    add(V, {fa[v], fa[v]});
    for (auto [L, R]:U) V.push_back({L, R});
    assert(V.size() < 40);
    return V;
}

set<int> seg[maxN];
void build(int id, int l, int r) {
    seg[id].clear();
    if (l==r) return;
    int mid = (l+r)/2;
    build(id*2, l, mid); build(id*2+1, mid+1, r);
}
void update(int id, int l, int r, int findl, int findr, int val, bool add) {
    if (r<findl || findr<l) return;
    if (findl<=l && r<=findr) {
        if (add) seg[id].insert(val);
        else seg[id].erase(val);
        return;
    }
    int mid = (l+r)/2;
    update(id*2, l, mid, findl, findr, val, add);
    update(id*2+1, mid+1, r, findl, findr, val, add);
}
vector<int> nxt;
void qry(int id, int l, int r, int target) {
    if (r<target || target<l) return;
    for (int i:seg[id]) nxt.push_back(i);
    if (l==r) return;
    int mid = (l+r)/2;
    qry(id*2, l, mid, target); qry(id*2+1, mid+1, r, target);
}

int S[maxn], T[maxn], vis[maxn];
bool die = false;
set<int> exist;

void dfs4(int u) {
    int s = a[u].first, t = a[u].second;
    vis[u] = 1;
    vector<pair<int,int>> path = PATH(s, t);
    for (auto [L, R]:path) {
        int cur = L-1;
        while (exist.size() > 0) {
            cur = *exist.upper_bound(cur);
            if (cur > R) break;
            if (cur==s) continue;
            int v = S[cur];
            // cout << u << " " << v << endl;
            if (!vis[v]) dfs4(v);
            else if (vis[v]==1) die = true;
            if (die) return;
        }
    }
    nxt.clear();
    qry(1, 1, n, t);
    for (int v:nxt) if (v!=u) {
        // cout << u << " " << v << endl;
        if (!vis[v]) dfs4(v);
        else if (vis[v]==1) die = true;
        if (die) return;
    }
    for (auto [L, R]:path) update(1, 1, n, L, R, u, 0);
    exist.erase(s);
    vis[u] = 2;
}

void solve() {
    cin >> n;
    for (int i=1;i<=n;i++) sz[i] = 0, adj[i].clear(), ADJ[i].clear();
    cnter = 0;
    for (int i=1;i<=n-1;i++) {
        int u, v;
        cin >> u >> v;
        ADJ[u].push_back(v);
        ADJ[v].push_back(u);
    }
    fa[1] = 0, d[1] = 0;
    dfs1(1); dfs2(1);
    for (int i=1;i<=n;i++) for (int j:ADJ[i]) adj[newid[i]].push_back(newid[j]);
    for (int i=1;i<=n;i++) for (int j=0;j<lgn;j++) binlift[i][j] = {-1, {}};
    dfs3(1);
    exist = {INF};
    build(1, 1, n);
    for (int i=1;i<=n;i++) S[i] = -1, T[i] = -1;
    cin >> m;
    for (int i=1;i<=m;i++) {
        int s, t;
        cin >> s >> t;
        s = newid[s], t = newid[t];
        a[i] = {s, t};
        S[s] = T[t] = i;
        exist.insert(a[i].first);
        vector<pair<int,int>> path = PATH(a[i].first, a[i].second);
        for (auto [L, R]:path) update(1, 1, n, L, R, i, 1);
    }
    for (int i=1;i<=m;i++) vis[i] = 0;
    die = false;
    for (int i=1;i<=m;i++) if (!vis[i]) {
        dfs4(i);
        if (die) break;
    }
    if (die) cout << "No\n";
    else cout << "Yes\n";
}

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t;
    cin >> t;
    while (t--) solve();
}
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 107608 KB Output is correct
2 Correct 19 ms 107612 KB Output is correct
3 Correct 19 ms 107608 KB Output is correct
4 Correct 35 ms 107880 KB Output is correct
5 Correct 51 ms 107864 KB Output is correct
6 Correct 20 ms 107868 KB Output is correct
7 Correct 21 ms 107812 KB Output is correct
8 Correct 22 ms 107868 KB Output is correct
9 Correct 83 ms 111696 KB Output is correct
10 Correct 159 ms 195156 KB Output is correct
11 Correct 33 ms 107612 KB Output is correct
12 Correct 82 ms 107864 KB Output is correct
13 Correct 286 ms 214100 KB Output is correct
14 Correct 250 ms 214096 KB Output is correct
15 Correct 480 ms 233016 KB Output is correct
16 Correct 1202 ms 285952 KB Output is correct
17 Correct 495 ms 245288 KB Output is correct
18 Correct 290 ms 218100 KB Output is correct
19 Correct 403 ms 239400 KB Output is correct
20 Correct 380 ms 239276 KB Output is correct
21 Correct 438 ms 244980 KB Output is correct
22 Correct 196 ms 203112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 107724 KB Output is correct
2 Correct 20 ms 107664 KB Output is correct
3 Correct 23 ms 107868 KB Output is correct
4 Correct 26 ms 107788 KB Output is correct
5 Correct 24 ms 107972 KB Output is correct
6 Correct 23 ms 107868 KB Output is correct
7 Correct 23 ms 107980 KB Output is correct
8 Correct 23 ms 107864 KB Output is correct
9 Correct 29 ms 107864 KB Output is correct
10 Runtime error 102 ms 218724 KB Execution killed with signal 6
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 107724 KB Output is correct
2 Correct 20 ms 107664 KB Output is correct
3 Correct 23 ms 107868 KB Output is correct
4 Correct 26 ms 107788 KB Output is correct
5 Correct 24 ms 107972 KB Output is correct
6 Correct 23 ms 107868 KB Output is correct
7 Correct 23 ms 107980 KB Output is correct
8 Correct 23 ms 107864 KB Output is correct
9 Correct 29 ms 107864 KB Output is correct
10 Runtime error 102 ms 218724 KB Execution killed with signal 6
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 107724 KB Output is correct
2 Correct 20 ms 107664 KB Output is correct
3 Correct 23 ms 107868 KB Output is correct
4 Correct 26 ms 107788 KB Output is correct
5 Correct 24 ms 107972 KB Output is correct
6 Correct 23 ms 107868 KB Output is correct
7 Correct 23 ms 107980 KB Output is correct
8 Correct 23 ms 107864 KB Output is correct
9 Correct 29 ms 107864 KB Output is correct
10 Runtime error 102 ms 218724 KB Execution killed with signal 6
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 107724 KB Output is correct
2 Correct 20 ms 107664 KB Output is correct
3 Correct 23 ms 107868 KB Output is correct
4 Correct 26 ms 107788 KB Output is correct
5 Correct 24 ms 107972 KB Output is correct
6 Correct 23 ms 107868 KB Output is correct
7 Correct 23 ms 107980 KB Output is correct
8 Correct 23 ms 107864 KB Output is correct
9 Correct 29 ms 107864 KB Output is correct
10 Runtime error 102 ms 218724 KB Execution killed with signal 6
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 107720 KB Output is correct
2 Correct 22 ms 107604 KB Output is correct
3 Correct 24 ms 107688 KB Output is correct
4 Correct 22 ms 107608 KB Output is correct
5 Correct 29 ms 107852 KB Output is correct
6 Correct 21 ms 107864 KB Output is correct
7 Correct 25 ms 108124 KB Output is correct
8 Correct 21 ms 107612 KB Output is correct
9 Correct 22 ms 107612 KB Output is correct
10 Correct 22 ms 107728 KB Output is correct
11 Correct 22 ms 107728 KB Output is correct
12 Correct 26 ms 107868 KB Output is correct
13 Correct 68 ms 107940 KB Output is correct
14 Correct 103 ms 107868 KB Output is correct
15 Incorrect 92 ms 107920 KB Output isn't correct
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 107608 KB Output is correct
2 Correct 19 ms 107612 KB Output is correct
3 Correct 19 ms 107608 KB Output is correct
4 Correct 35 ms 107880 KB Output is correct
5 Correct 51 ms 107864 KB Output is correct
6 Correct 20 ms 107868 KB Output is correct
7 Correct 21 ms 107812 KB Output is correct
8 Correct 22 ms 107868 KB Output is correct
9 Correct 83 ms 111696 KB Output is correct
10 Correct 159 ms 195156 KB Output is correct
11 Correct 33 ms 107612 KB Output is correct
12 Correct 82 ms 107864 KB Output is correct
13 Correct 286 ms 214100 KB Output is correct
14 Correct 250 ms 214096 KB Output is correct
15 Correct 480 ms 233016 KB Output is correct
16 Correct 1202 ms 285952 KB Output is correct
17 Correct 495 ms 245288 KB Output is correct
18 Correct 290 ms 218100 KB Output is correct
19 Correct 403 ms 239400 KB Output is correct
20 Correct 380 ms 239276 KB Output is correct
21 Correct 438 ms 244980 KB Output is correct
22 Correct 196 ms 203112 KB Output is correct
23 Correct 22 ms 107724 KB Output is correct
24 Correct 20 ms 107664 KB Output is correct
25 Correct 23 ms 107868 KB Output is correct
26 Correct 26 ms 107788 KB Output is correct
27 Correct 24 ms 107972 KB Output is correct
28 Correct 23 ms 107868 KB Output is correct
29 Correct 23 ms 107980 KB Output is correct
30 Correct 23 ms 107864 KB Output is correct
31 Correct 29 ms 107864 KB Output is correct
32 Runtime error 102 ms 218724 KB Execution killed with signal 6
33 Halted 0 ms 0 KB -