QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1320#838644#9924. ReconstructionSuika_predatorSuika_predatorSuccess!2024-12-31 17:11:342024-12-31 17:11:34

详细

Extra Test:

Wrong Answer
time: 0ms
memory: 44556kb

input:

4
1 2
2 3
3 4
2 1
1 4
4 3

output:

1100

result:

wrong answer 1st lines differ - expected: '0000', found: '1100'

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#838644#9924. ReconstructionSuika_predatorWA 555ms91512kbC++202.4kb2024-12-31 17:10:262024-12-31 17:26:09

answer

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n ;
struct tree {
    vector<int> E[N];
    int L[N] , R[N] , dft = 0;
    int f[N] , rd[N];
    void init() {
        for(int i = 1;i < n;i++) {
            int u , v;cin >> u >> v;
            E[u].push_back(v) ; E[v].push_back(u) ;
        }
    }
    void dfs(int fa,int u) {
        L[u] = ++dft ; f[u] = fa; rd[dft] = u;
        for(auto v : E[u]) {
            if(v != fa)
                dfs(u , v);
        }
        R[u] = dft;
    }
}t1 , t2;
struct prefix {
    int c[N];
    void add(int l,int r) {
        c[l]++ ;
        c[r + 1]-- ;
    }
    void get() {
        for(int i = 1;i <= n;i++) c[i] += c[i - 1];
    }
}b;
int getp(int u,int v) {
    if(t1.L[u] <= t1.L[v] && t1.L[v] <= t1.R[u]) {
        return t1.f[v] ;
    }
    return t1.f[u] ;
    
}
int ans[N];
bool chk(int rt) {
    if(rt == -1) return 0;
    t2.dft = 0;
    t2.dfs(0 , rt) ;
    for(int i = 1;i <= n;i++) {
        vector<int> son ;
        for(auto v : t2.E[i]) {
            if(v != t2.f[i]) son.push_back(v) ;
        }
        vector<int> ok(son.size()) ;
        for(auto v : t1.E[i]) {
            int p = t2.L[v];
            if(t2.L[i] <=  p && p <= t2.R[i]) {
                auto it = upper_bound(son.begin() , son.end() , v , [&](int u,int v) {
                    return t2.L[u] < t2.L[v] ;
                }) - son.begin() - 1;
                ok[it]++ ;
            }
        }
        for(auto x : ok) {
            if(x != 1) return 0;
        }
    }
    return 1;
}
int main() {
    ios::sync_with_stdio(false) ; cin.tie(0) ;
    cin >> n;
    t1.init() ; t2.init() ;
    t1.dfs(0 , 1) ; t2.dfs(0 , 1);
    for(int i = 2;i <= n;i++) {
        int v = t2.f[i] ;
        int p = getp(i , v);
        if(p == i || p == v) {b.add(1,n) ; continue ;}
        // printf("%d %d : %d\n",i,v,p) ;
        if( !(t2.L[i] <= t2.L[p] && t2.L[p] <= t2.R[i]) )b.add(t2.L[i] , t2.R[i]) ;
        else {
            b.add(1 , t2.L[i] - 1) ;
            b.add(t2.R[i] + 1 , n);
        }
    }
    b.get() ;
    int rt = -1;
    for(int i = 1;i <= n;i++) {
        // printf("I %d %d\n",i,b.qry(i)) ;
        if(b.c[i] == n-1) {ans[t2.rd[i]] = 1; rt = t2.rd[i] ;}
    }
    
    //if(!chk(rt)) memset(ans , 0 , sizeof(ans)) ;
    for(int i = 1;i <= n;i++) cout << ans[i] ;  cout << '\n';
}