社区讨论
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 条回复,欢迎继续交流。
正在加载回复...