QOJ.ac
QOJ
ID | 提交记录ID | 题目 | Hacker | Owner | 结果 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|
#1320 | #838644 | #9924. Reconstruction | Suika_predator | Suika_predator | Success! | 2024-12-31 17:11:34 | 2024-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. Reconstruction | Suika_predator | WA | 555ms | 91512kb | C++20 | 2.4kb | 2024-12-31 17:10:26 | 2024-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';
}