Submission #27158

# Submission time Handle Problem Language Result Execution time Memory
27158 2017-07-09T17:23:23 Z wwiiiii None (KOI16_treeM) C++14
0 / 100
1119 ms 35988 KB
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int N = 200100;
set<int> adj[N];
int parent[N];
int treeidx[N];
int n, q, maxidx, visitmax;
int visited[N];
void reindex(int node) {
	treeidx[node] = maxidx;
	for (auto next : adj[node]) {
		if (treeidx[next] != maxidx) {
			treeidx[next] = maxidx;
			reindex(next);
		}
	}
}

void cut(int node)
{
	visitmax++;
	if (node == parent[node]) return;
	adj[node].erase(parent[node]);
	adj[parent[node]].erase(node);
	queue<int> q, pq;
	q.push(node); pq.push(parent[node]);
	int qnow = -1, pqnow = -1;
	set<int>::iterator qit, pqit;
	while ((!q.empty()) && (!pq.empty()))
	{
		while (qnow == -1 || qit == adj[qnow].end()) {
			if (q.empty()) break;
			qnow = q.front(); q.pop();
			qit = adj[qnow].begin();
			while (qit != adj[qnow].end() && visited[*qit] == visitmax) qit++;
		}
		if (!q.empty()) {
			visited[*qit] = visitmax;
			q.push(*qit); qit++;
		}
		while (pqnow == -1 || pqit == adj[pqnow].end()) {
			if (pq.empty()) break;
			pqnow = pq.front(); pq.pop();
			pqit = adj[pqnow].begin();
			while (pqit != adj[pqnow].end() && visited[*pqit] == visitmax) pqit++;
		}
		if (!pq.empty()) {
			visited[*qit] = visitmax;
			pq.push(*pqit); pqit++;
		}
	}

	maxidx++;
	if (q.empty()) reindex(node);
	else reindex(parent[node]);

	parent[node] = node;

}

int main()
{
	scanf("%d %d", &n, &q);
	for (int i = 2; i <= n; i++) {
		scanf("%d", &parent[i]);
		adj[parent[i]].insert(i);
		adj[i].insert(parent[i]);
	}
	while (q--) {
		int b, c, d; scanf("%d %d", &b, &c);
		switch (b)
		{
		case 0:
			cut(c); break;
		case 1:
            scanf("%d", &d);
			if (treeidx[d] == treeidx[c])
			{
				puts("YES");
			}
			else
			{
				puts("NO");
			}
            break;
		}
	}
}

Compilation message

tree.cpp: In function 'int main()':
tree.cpp:66:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &q);
                        ^
tree.cpp:68:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &parent[i]);
                          ^
tree.cpp:73:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int b, c, d; scanf("%d %d", &b, &c);
                                      ^
tree.cpp:79:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &d);
                            ^
# Verdict Execution time Memory Grader output
1 Incorrect 3 ms 13796 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 3 ms 13796 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1119 ms 35988 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 3 ms 13796 KB Output isn't correct
2 Halted 0 ms 0 KB -