Building Fire Stations Gym - 100554B

2024-02-22 18:18

本文主要是介绍Building Fire Stations Gym - 100554B,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://codeforces.com/gym/100554/problem/B

考虑二分一个距离 看能否选两个点用这个距离把整个图覆盖 具体选哪两个点 肯定在直径上 感觉就在直径对称位置上 比赛时就想到这 然后居然觉得不对 还想了个例子把自己推翻了 真他妈智障啊。。其实正解就是这样

在直径对称位置上选择uv这两点后 整个树图被分为三块 uv子树各一块 剩下的为一块 u到直径端点就是我当前二分的这个距离 u子树上其余点到u肯定比这个距离要近啊 不然直径端点肯定不是当前这个了 当时就是没有想到这一点 还是对树的直径理解不够

 

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;struct node
{int v,next;
};queue <int> que;
node edge[2*maxn];
int first[maxn],fa[maxn],pre[maxn],book[maxn],dis[maxn];
int n,num,p1,p2,d;void addedge(int u,int v)
{edge[num].v=v;edge[num].next=first[u];first[u]=num++;
}void dfs(int cur,int &res,int &maxx,int dis)
{int i,v;if(maxx<dis) maxx=dis,res=cur;for(i=first[cur];i!=-1;i=edge[i].next){v=edge[i].v;if(v!=fa[cur]){fa[v]=cur;dfs(v,res,maxx,dis+1);}}
}void init()
{int u;fa[1]=0,d=0;dfs(1,p1,d,0);fa[p1]=0,d=0;dfs(p1,p2,d,0);num=0,u=p2;while(u!=0){pre[++num]=u;u=fa[u];}
}void bfs(int d,int u)
{int i,v;while(!que.empty()) que.pop();que.push(u);fa[u]=0,dis[u]=0,book[u]=1;while(!que.empty()){u=que.front();que.pop();if(dis[u]==d) continue;for(i=first[u];i!=-1;i=edge[i].next){v=edge[i].v;if(v!=fa[u]){fa[v]=u,dis[v]=dis[u]+1,book[v]=1;que.push(v);}}}
}bool judge(int d,int u,int v)
{int i;memset(book,0,sizeof(book));bfs(d,u),bfs(d,v);for(i=1;i<=n;i++) if(!book[i]) return 0;return 1;
}void solve()
{int i,l,r,m,ans,u,v;l=1,r=(num+1)/2;while(l<=r){m=(l+r)/2;if(judge(m-1,pre[m],pre[num-m+1])) r=m-1,ans=m-1,u=pre[m],v=pre[num-m+1];else l=m+1;}if(u==v) v=edge[first[u]].v;printf("%d %d %d\n",ans,u,v);
}int main()
{int t,i,u,v;scanf("%d",&t);while(t--){scanf("%d",&n);memset(first,-1,sizeof(first));num=0;for(i=1;i<=n-1;i++){scanf("%d%d",&u,&v);addedge(u,v),addedge(v,u);}init();solve();}return 0;
}/*
1
9
1 2
2 3
1 4
4 5
1 6
6 7
1 8
8 9
*/

 

这篇关于Building Fire Stations Gym - 100554B的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736100

相关文章

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro

#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version

昨天编译文件时出现了Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~的错误。   在网上很容易找到了解决的方案,公布如下:   对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享 DLL 中使

【HDU】5033 Building 单调栈

传送门:【HDU】5033 Building 题目分析:就单调栈用叉积左右维护一个上凸壳就好了。。。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std ;typedef long long LL ;#define rep

【codeforces】gym 101137 K - Knights of the Old Republic【用最小生成树对图做集合dp】

题目链接:【codeforces】gym 101137 K - Knights of the Old Republic 考虑对图集合dp,一个连通块的dp值为两个连通块的值的和或者强制加一条新边后的最小值,取个最小值(边从小到大枚举,则强制加一条最大的边会导致连通块内较小的边一定都选,则会构成一个生成树)。用kruskal实现这个dp过程即可。 #include <bits/stdc++.h>

【codeforces】gym 101138 K. The World of Trains【前缀和优化dp】

题目链接:K. The World of Trains 记录一个横着的前缀dp和以及斜着的前缀dp,复杂度 O(n2) O(n^2) #include <bits/stdc++.h>using namespace std ;typedef pair < int , int > pii ;typedef long long LL ;#define clr( a , x ) memset (

How to user “Discrete“ object in openai-gym environments?

题意:怎样在 OpenAI Gym 环境中使用 “Discrete” 对象 问题背景: I am trying to create a Q-Learning agent for a openai-gym "Blackjack-v0" environment. I am trying to get the size of the observation space but its in

OpenAI Gym custom environment: Discrete observation space with real values

题意:OpenAI Gym 自定义环境:具有实数值的离散观测空间 问题背景: I would like to create custom openai gym environment that has discrete state space, but with float values. To be more precise, it should be a range of valu

Building Materials

From 建材 https://baike.baidu.com/item/%E5%BB%BA%E6%9D%90/4776273?fr=ge_ala 建材 building materials 土木工程 civil engineering 建筑工程 constructional engineering 结构材料 STRUCTURAL MATERIALS 木材 timber 竹材 bamboo w

The user operation is waiting for building workspace to complete”

今天在运行android程序时,显示“the user operation is waiting for "building workspace" tocomplete”,查找解决办法如下:   1.选择菜单栏的“Project”,然后把菜单栏中“BuildAutomatically”前面的对钩去掉。 2.当你修改或添加代码后,选择菜单栏的“Project”,然后选择菜单栏中“BuildA

building gradle project info问题

导入Android Studio项目的时候总是出现一个小弹窗,写着building gradle project info。 长时间没有响应,关也关不掉,用任务管理器干掉,用一下方式试试 新建一个正常项目,打开项目文件夹,复制它的gradle文件夹到需要被导入的项目的文件夹里,代替它自己的gradle文件夹。 打开之后可能会说找不到gradle版本,,只要把build.gradle里面的gr