답안 #994273

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
994273 2024-06-07T10:11:42 Z vjudge1 Jail (JOI22_jail) C++17
0 / 100
835 ms 10884 KB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;

#define int ll
void solve();

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);

    int t=1;
    cin>>t;
    while (t--) solve();
    return 0;
}

const int maxn = 120'000;


vector<vector<int>> g(maxn);
vector<int> num(maxn);
int n,m;
vector<int> s(maxn),t(maxn);
vector<vector<int>> path(maxn);
vector<bool> has(maxn,false);

bool dfs (int v, int start, int par=-1){
    bool ret=false;
    if (v==t[start]) return true;
    for (int to : g[v]){
        if (to==par) continue;
        ret = ret || dfs(to, start, v);
        if (ret){
            num[to]++;
            path[start].push_back(to);
            break;
        }
    }
    return ret;
}

void dolanc(){
    cin>>m;
    vector<int> lst(maxn,0);
    vector<int> rst(maxn,0);
    vector<pair<int,int>> srt;
    bool ans=true;
    for (int i = 1; i <= m; i++)
    {
        cin>>s[i]>>t[i];
        if (s[i]<t[i]) lst[t[i]]=i;
        else rst[t[i]]=i;
        if (s[i]<t[i]) srt.push_back({s[i], 0-t[i]});
        else srt.push_back({t[i], 0-s[i]});
    }
    sort(srt.begin(), srt.end());
    int mx=0;
    for (int i=1;i<=n;i++){
        if (lst[i]){
            if (mx>=i) ans=false;
        }
        else if (rst[i]){
            mx=max(mx, s[rst[i]]);
        }
    }

    stack<pair<int,int>> st;

    for (auto x: srt){
        int i=x.first;
        int j=0-x.second;
        while (!st.empty() && st.top().second<j) st.pop();
        if (!st.empty()) ans=false;
        st.push(make_pair(i,j));
    }

    if (ans){
        cout<<"Yes\n";
    }
    else {
        cout<<"No\n";
    }
}

void solve(){
    cin>>n;
    path.assign(maxn, {});
    num.assign(maxn,0);
    has.assign(maxn,false);
    g.assign(maxn,{});
    queue<int> q;
    bool lanc=true;
    for (int i = 1; i < n; i++)
    {
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
        if (a!=i || b!=i+1) lanc=false;
    }
    if (lanc){
        dolanc();
        return;
    }
    cin>>m;
    for (int i = 1; i <= m; i++)
    {
        cin>>s[i]>>t[i];
        dfs(s[i], i);
        num[s[i]]++;
        q.push(i);
        has[s[i]]=true;
    }

    bool change=true;
    while (change){
        change=false;
        int sz=q.size();
        for (int i=0;i<sz;i++){
            int cur=q.front();
            q.pop();
            bool rem=num[t[cur]]-1;

            for (int j : path[cur]){
                if (has[j]) rem=true;
            }
            if (rem) {
                q.push(cur);
                continue;
            }
            change=true;
            has[s[cur]]=false;
            num[s[cur]]--;
            for (int j : path[cur]){
                num[j]--;
            }
        }
    }
    if (q.empty()){
        cout<<"Yes\n";
    }
    else {
        cout<<"No\n";
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 10588 KB Output is correct
2 Correct 9 ms 10680 KB Output is correct
3 Correct 7 ms 10588 KB Output is correct
4 Incorrect 412 ms 10884 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 10588 KB Output is correct
2 Correct 9 ms 10616 KB Output is correct
3 Incorrect 35 ms 10880 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 10588 KB Output is correct
2 Correct 9 ms 10616 KB Output is correct
3 Incorrect 35 ms 10880 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 10588 KB Output is correct
2 Correct 9 ms 10616 KB Output is correct
3 Incorrect 35 ms 10880 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 10588 KB Output is correct
2 Correct 9 ms 10616 KB Output is correct
3 Incorrect 35 ms 10880 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 10588 KB Output is correct
2 Correct 4 ms 8796 KB Output is correct
3 Correct 7 ms 10832 KB Output is correct
4 Correct 5 ms 10588 KB Output is correct
5 Incorrect 835 ms 10820 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 10588 KB Output is correct
2 Correct 9 ms 10680 KB Output is correct
3 Correct 7 ms 10588 KB Output is correct
4 Incorrect 412 ms 10884 KB Output isn't correct
5 Halted 0 ms 0 KB -