D题求助

#include<iostream>

#include<vector>

#define endl "\n"

#define int long long

using namespace std;

const int N=2e5+5;

vector<int> edge[N];

int dep[N],n,k;

void dfs(int u,int fa){

dep[u]=dep[fa]+1;

for(int i=0;i<edge[u].size();i++){

int v=edge[u][i];

if(v==fa)continue;

dfs(v,u);

}

}

bool b[2][N];

void calc(int u,int x){

dfs(u,0);

int maxx=0;

for(int i=1;i<=n;i++)maxx=max(maxx,dep[i]);

for(int i=1;i<=n;i++){

if(maxx==dep[i])b[x][i]=true;

}

}

signed main(){

cin.tie(0);cout.tie(0);

ios::sync_with_stdio(false);

int t;

cin>>t;dep[0]=-1;

while(t--){

cin>>n>>k;

for(int i=1;i<=n;i++)edge[i].clear(),b[0][i]=b[1][i]=0;

for(int i=1;i<n;i++){

int u,v;

cin>>u>>v;

edge[u].push_back(v);

edge[v].push_back(u);

}

calc(1,1);

int o=0;

for(int i=1;i<=n;i++){

if(o==10)break;

if(b[1][i])calc(i,0),o++;

}

o=0;

for(int i=1;i<=n;i++){

if(o==10)break;

if(b[0][i])calc(i,1),o++;

}

for(int i=1;i<=n;i++)cout<<b[k&1][i]<<" ";

cout<<endl;

}

}

通过96.43%,但我在场上hack了半天也没hack掉啊?求hack

全部评论
出题人来啦~这个代码的问题在于设置了o=10时break hack样例比较大,如下(可以看图片,以2为根的子树是一个完全二叉树): 1 33 2 1 3 3 6 6 11 11 20 1 2 2 4 2 5 4 7 4 8 5 9 5 10 7 12 7 13 8 14 8 15 9 16 9 17 10 18 10 19 12 21 12 22 13 23 13 24 14 25 14 26 15 27 15 28 16 29 16 30 17 31 17 32 20 33 这样一来,在calc(i,1)时,遍历到的前10个点都处于2所在的子树中,代码没能从20号点出发寻找21~32号点,导致错误。 --- 那么把o开大一点可以吗?显然也不行,当n变得更大时,显然左边子树的规模也会变大,代码需要跑大约n/2次之后才能找到离开2所在的子树
2 回复 分享
发布于 08-29 13:21 江苏
勘误一下,是代码没能从33号点出发寻找21~32号点
1 回复 分享
发布于 08-29 13:21 江苏
懂了,thx
点赞 回复 分享
发布于 08-29 17:32 广东

相关推荐

运营你豪哥:1.模板换一个,现在的模板基础信息加个照片已经占了30%的空间。 2.实习经历的描述,按时间倒序标注清楚,选2-3段和你求职意向契合的经历填写。 3.自我评价再改改,要不就删了;怎么感觉自我评价是在介绍你专业的培养体系,看不出重点要突出什么。
听劝,这个简历怎么改
点赞 评论 收藏
分享
08-05 18:14
门头沟学院 Java
小花的沉默:是学历厂没错啊,学历太高了不要
投递小鹏汽车等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务