QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876532#9924. ReconstructionltunjicWA 763ms126296kbC++202.6kb2025-01-30 23:21:452025-01-30 23:21:52

Judging History

This is the latest submission verdict.

  • [2025-01-30 23:21:52]
  • Judged
  • Verdict: WA
  • Time: 763ms
  • Memory: 126296kb
  • [2025-01-30 23:21:45]
  • Submitted

answer

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>

#define X first
#define Y second
#define PB push_back
#define deb(...) //fprintf(stderr, __VA_ARGS__)

using namespace std; 

typedef pair<int, int> pii;
typedef long long ll;

const int LOG = 19;
const int N = 1 << LOG;

int iv[N], ma[N], mrv;
int dep[N], up[N][LOG];

vector<int> g[N], h[N];

void dfs(int u) { 
	iv[u] = mrv++;
	for(int v : h[u]) {
		if(!dep[v]) { 
			dep[v] = dep[u] + 1;
			up[v][0] = u;
			dfs(v);
		}
	}
	ma[u] = mrv;
}

int popni(int u, int d) { 
	for(int i = LOG - 1; i >= 0; --i) { 
		if(d & (1 << i)) { u = up[u][i]; }
	}
	return u;
}

int cur[N], deg1[N], deg2[N], c[N], cnt1;

void update(int u) { 
	cnt1 += (c[u] == deg2[u]) - cur[u];
	cur[u] = c[u] == deg2[u];
}

int n;
vector<pair<pii, int>> pr;

void reroot(int u, int v) {
//	deb("%d -> %d : ", u, v);
//	for(int i = 1; i <= n; ++i) { deb("(%d %d) ", c[i], deg2[i]); } 
	int ind = lower_bound(pr.begin(), pr.end(), make_pair(make_pair(u, v), -1)) - pr.begin();
//	deb("{ %d %d %d } ", pr[ind].X.X, pr[ind].X.Y, pr[ind].Y);
	int x = pr[ind].Y;
	c[u] -= x;
	c[v] = deg1[v];
	--deg2[u];
	++deg2[v];
	update(u);
	update(v);
//	deb("-> ");
//	for(int i = 1; i <= n; ++i) { deb("(%d %d) ", c[i], deg2[i]); } 
//	deb("\n");
}

bool ans[N];

void solve(int u, int p) {
	ans[u] = cnt1 == n;
	for(int v : h[u]) { 
		if(v != p) { 
			reroot(u, v);
			solve(v, u);
			reroot(v, u);
		}
	}
}

int tmp[N];

int main() { 
	dep[1] = 1;

	scanf("%d", &n);
	for(int i = 0; i < n - 1; ++i) { 
		int u, v;
		scanf("%d%d", &u, &v);
		g[u].PB(v);
		g[v].PB(u);
	}
	for(int i = 0; i < n - 1; ++i) { 
		int u, v;
		scanf("%d%d", &u, &v);
		h[u].PB(v);
		h[v].PB(u);
	}

	dfs(1);

	for(int i = 1; i < LOG; ++i)
		for(int j = 1; j <= n; ++j) { 
			up[j][i] = up[up[j][i - 1]][j - 1];
		}

	for(int u = 1; u <= n; ++u) { 
		deg1[u] = g[u].size();
		deg2[u] = h[u].size();

		for(int v : g[u]) { 
			if(iv[v] > iv[u] && ma[v] <= ma[u]) { 
				++tmp[popni(v, dep[v] - dep[u] - 1)];
				deb("%d -> %d : %d\n", u, v, popni(v, dep[v] - dep[u] - 1));
				++c[u];
			}
		}

		for(int v : h[u]) { 
			if(dep[v] < dep[u]) { 
				pr.PB({{u, v}, deg1[u] - c[u]});
				--deg2[u];
			} else {
				pr.PB({{u, v}, tmp[v]});
				tmp[v] = 0;
			}
		}

		update(u);
		deb("%d: dep %d deg 1) %d 2) %d cur %d\n", u, dep[u], deg1[u], deg2[u], c[u]);
	}

	sort(pr.begin(), pr.end());
//	for(auto x : pr) deb("%d %d %d\n", x.X.X, x.X.Y, x.Y);

	solve(1, 0);

	for(int i = 1; i <= n; ++i) { printf("%d", ans[i]); } printf("\n"); 
	return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 18212kb

input:

3
1 2
2 3
2 1
1 3

output:

001

result:

ok single line: '001'

Test #2:

score: 0
Accepted
time: 0ms
memory: 16212kb

input:

6
1 3
3 4
3 6
4 5
5 2
1 3
1 4
4 5
5 2
3 6

output:

010110

result:

ok single line: '010110'

Test #3:

score: 0
Accepted
time: 1ms
memory: 14164kb

input:

1

output:

1

result:

ok single line: '1'

Test #4:

score: 0
Accepted
time: 0ms
memory: 16212kb

input:

2
1 2
1 2

output:

11

result:

ok single line: '11'

Test #5:

score: -100
Wrong Answer
time: 763ms
memory: 126296kb

input:

500000
321614 78209
64619 204431
81539 336200
128603 201377
132521 391792
41587 137224
174146 381680
341915 451206
493371 256005
259794 168656
161914 462290
105839 333679
377214 267008
283062 457340
219692 196741
123276 321510
473789 410796
498171 203543
178249 456921
255509 449152
294196 457566
277...

output:

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000...

result:

wrong answer 1st lines differ - expected: '000000000000000000000000000000...0000000000000000000000000000000', found: '000000000000000000000000000000...0000000000000000000000000000000'