社区讨论

ABC 痛失 475 pts 求助!

学术版参与者 4已保存回复 27

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
27 条
当前快照
1 份
快照标识符
@lo2itf9y
此快照首次捕获于
2023/10/23 14:32
2 年前
此快照最后确认于
2023/10/23 14:32
2 年前
查看原帖
rt,E 题写了个 set 模拟。
具体来说就是每次找到叶子结点,然后把它的父亲和其连向的所有点全部删掉(具体来说就是删边),但是写出来的代码被卡了一个点,跑了 2207ms。
求助啊 qwq,人快没了
CPP
#include<bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int n, d[N], a[N];
unordered_set<int> g[N], ins;

int read(){
	int n = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-')	f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')	n = n * 10 + (ch ^ 48), ch = getchar();
	return n * f;
}

void write(int x){
	if(x < 0)	putchar('-'), x = -x;
	if(x >= 10) write(x / 10);
	putchar(x % 10 + '0');
}

int main(){
	n = read();
	for(int i=1,u,v;i<n;i++){
		u = read(), v = read();
		++d[u], ++d[v];
		g[u].insert(v);
		g[v].insert(u);
	}
	for(int i=1;i<=n;i++)
		ins.insert(i);
	int len = 0;
	while(!ins.empty()){
		for(unordered_set<int>::iterator u=ins.begin();u!=ins.end();u++){
			int v = *u;
			if(d[v] == 1){
				int fa = *g[v].begin();
				a[++len] = d[fa]; 
				for(unordered_set<int>::iterator k=g[fa].begin();k!=g[fa].end();k++){
					int kk = *k;
					if(d[kk] > 1){
						for(unordered_set<int>::iterator r=g[kk].begin();r!=g[kk].end();r++){
							if(*r == fa)
								continue;
							g[*r].erase(g[*r].find(kk)), --d[*r];
						}
					}
					g[*k].clear(), d[*k] = 0;
				}
				g[fa].clear(), d[fa] = 0;
			}
		}
		unordered_set<int> ss;
		for(unordered_set<int>::iterator u=ins.begin();u!=ins.end();u++)
			if(d[*u])
				ss.insert(*u);
		ins = ss;
	}
	sort(a + 1, a + 1 + len);
	for(int i=1;i<=len;i++){
		write(a[i]);
		putchar(' ');
	}
	return 0;
}

回复

27 条回复,欢迎继续交流。

正在加载回复...