9.24 test T2 factory工厂 题解

【问题描述】
    秋之国有n个城市(编号为1到n)和n − 1条双向道路,每条道路的长度均为1,任意两个城市之间都可以互相到达。
    小D打算选择一个城市建工厂,他生产的货品需要m种原料,其中第?种可以在城市a?买到。小 D 希望工厂所在的城市到每个a?的距离都不超过d。
    秋之国的道路经常发生变动,小D 会告诉你道路的变动情况,并给出若干次询问,每次你需要回答当前有多少个城市可以作为工厂的所在地。


【输入格式】
    第一行四个正整数n,m,q,d,其中q表示事件数。
    第二行m个正整数,表示a?。
    接下来n − 1行,每行两个正整数,表示一条道路的两个端点。  
    接下来q行,每行先是一个正整数opt。 若opt = 1,接下来还有三个正整数p,x,y,表示第p条给出的道路被移除(可能是新增的道路,保证这条道路还未被移除) ,并新增一条连接x和y的道路,保证任意时刻任意两个城市之间都能相互到达。若opt = 2,表示一次询问。


【输出格式】
   对于每个询问输出一行一个整数,表示答案。


【样例输入】
   4 2 5 1
   1 2
   1 2
   2 3
   3 4
   2
   1 1 1 4
   2
   1 4 1 3
   2

【样例输出】
   2
   0
   1


【数据范围】
   对于30%的数据,n,m,q ≤ 100。对于70%的数据,n,m,q ≤ 5000。对于 100%的数据,n,m,q ≤ 30000,d≤n,保证询问数不超过100。


【题解】

先从任意点开始一重dfs找离他最远的关键点,然后再一次dfs从此关键点开始找离他最远的关键点。

此时这就是所有关键点里面相距最远的两个关键点,在这同时我们还要存储每个点离这两个点的距离。

然后我们直接进行距离的判断,这样就可以统计出答案。


【AC Code】

#include<bits/stdc++.h>
using namespace std;
namespace init{
    char buf[1<<15],*fs,*ft;
	inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
	inline int read(){
		int x=0,f=1;  char ch=getc();
		while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
		while(isdigit(ch))  {x=(x<<3)+(x<<1)+ch-'0';  ch=getc();}
		return x*f;
	}
}using namespace init;
int n,m,q,d;
int a[120010];
bool vis[120010],KEY[120010];
int linkk[120010],len;
struct edge{
	int to,next,w;
}e[120010];
void insert(int x,int y,int w)
{
	e[++len].to=y,e[len].next=linkk[x],linkk[x]=len,e[len].w=w;
}
int max_dis,max_id,max_dis_next,max_id_next;
int dis1[30010],dis2[30010],cnt;
void dfs(int x,int dis_)
{
	vis[x]=1;
	for(int i=linkk[x];i;i=e[i].next)
	{
		int v=e[i].to;
		if(!e[i].w||vis[v]) continue;
		dis2[v]=dis2[x]+e[i].w;
		if(dis2[v]>d&&dis1[v]<=d) --cnt;
		dfs(v,dis_+e[i].w);
	}
}
void dfs1(int x,int dis_)
{
	if(max_dis<dis_&&KEY[x]) max_dis=dis_,max_id=x;
	vis[x]=1;
	// dis1[x]=0;
	for(int i=linkk[x];i;i=e[i].next)
	{
		int v=e[i].to;
		if(!e[i].w||vis[v]) continue;
		dfs1(v,dis_+e[i].w);
	}
}
void dfs2(int x,int dis_)
{
	if(max_dis_next<dis_&&KEY[x]) max_dis_next=dis_,max_id_next=x;
	vis[x]=1;
	// dis2[x]=0;
	for(int i=linkk[x];i;i=e[i].next)
	{
		int v=e[i].to;
		if(!e[i].w||vis[v]) continue;
		dis1[v]=dis1[x]+e[i].w;
		if(dis1[v]>d) --cnt;
		dfs2(v,dis_+e[i].w);}
}
void solve()
{
	cnt=n;
	max_dis=max_dis_next=0;
	// memset(dis1,0,sizeof(dis1));
	// memset(dis2,0,sizeof(dis2));
	for(int i=1;i<=3;++i)
	{
		memset(vis,0,sizeof(vis));
		if(i==1) dfs1(1,0);
		if(i==2) dis1[max_id]=0,dfs2(max_id,0);
		if(i==3) dis2[max_id_next]=0,dfs(max_id_next,0);
	}
	// cout<<max_id<<' '<<max_dis
	//for(int i=1;i<=n;++i) if(dis[i]<=d) ++cnt;
	//for(int i=1;i<=n;++i) printf("%d ",dis[i]);
	//puts("");
	// cout<<max_dis<<' '<<max_id<<' '<<max_dis_next<<' '<<max_id_next<<endl; 
	// for(int i=1;i<=n;++i) cout<<dis1[i]<<' '<<dis2[i]<<endl;
	printf("%d\n",cnt);
}
int main()
{
	freopen("factory.in","r",stdin);
	freopen("factory.out","w",stdout);
	n=read(),m=read(),q=read(),d=read();
	for(int i=1;i<=m;++i) KEY[a[i]=read()]=1;
	for(int x,y,i=1;i<n;++i)
	{
		x=read(),y=read();
		insert(x,y,1);
		insert(y,x,1);
	}
	for(int opt,x,y,p,i=1;i<=q;++i)
	{
		opt=read();
		if(opt==1)
		{
			p=read(),x=read(),y=read();
			e[(p<<1)-1].w=e[p<<1].w=0;
			insert(x,y,1);
			insert(y,x,1);
		}
		else solve();
	}
	//system("pause");
	return 0;
}

ORZ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mendix 9.24.2是低代码开发平台Mendix的一个版本。要安装Mendix 9.24.2,您需要按照以下步骤操作: 首先,您需要从Mendix官方网站(https://www.mendix.com/)下载Mendix 9.24.2的安装文件。在网站上,您可以找到Mendix的下载页面,并选择适合您操作系统的安装文件。 下载完成后,双击安装文件开始安装程序。您将被引导到安装向导界面。按照向导的提示,选择安装语言、安装路径和其他设置。确保您具有管理员权限,否则可能无法完成安装过程。 安装过程可能需要一些时间,具体取决于您的计算机性能和网络速度。请耐心等待,直到安装完成。 安装完成后,打开Mendix的安装路径,您将找到Mendix Studio Pro的快捷方式。双击该快捷方式启动Mendix Studio Pro。 在Mendix Studio Pro中,您需要登录或注册Mendix账户。如果已经拥有Mendix账户,请输入您的登录凭据进行登录。如果没有账户,请按照界面上的指引注册一个新账户。 登录后,您可以开始使用Mendix 9.24.2进行低代码应用开发。根据您的需求,您可以创建新的应用、导入现有项目或浏览Mendix的示例模板。 总之,安装Mendix 9.24.2需要下载安装文件、执行安装程序、登录Mendix账户等步骤。安装完成后,您可以开始使用Mendix Studio Pro进行低代码应用开发。 ### 回答2: 要安装 Mendix 9.24.2,你可以按照以下步骤进行操作: 1. 首先,确保你的计算机符合 Mendix 9.24.2 的系统要求。Mendix 9.24.2 可以在 Windows、Mac 和 Linux 系统上运行,并需要一定的计算机性能和软件环境。 2. 访问 Mendix 官方网站并登录你的账号。如果你还没有账号,需要注册一个新的账号。 3. 在 Mendix 官网的下载页面,浏览下载选项,找到 Mendix 9.24.2 的安装包。根据你的操作系统选择相应的安装包进行下载。 4. 下载完成后,双击安装包运行安装程序。根据安装向导的指示,选择安装位置和其他可选设置。确保你已经阅读并同意安装程序的许可协议。 5. 安装程序会开始自动执行安装过程。这可能需要一些时间,具体取决于你的计算机性能和网络速度。 6. 安装完成后,你可以选择启动 Mendix Studio。根据指引输入你的 Mendix 账号信息,创建一个新的项目或者导入现有的项目。 7. 一旦项目加载完毕,你就可以开始使用 Mendix Studio 进行开发。Mendix Studio 提供了一套图形化的工具,帮助你建立应用程序的用户界面、逻辑和数据模型。 以上就是安装 Mendix 9.24.2 的简要步骤。请记住,具体的安装过程可能因操作系统和个人设置而有所不同,建议你参考 Mendix 官方文档或向他们的支持团队寻求帮助。 ### 回答3: Mendix 9.24.2是低代码开发平台Mendix的一个版本。要安装Mendix 9.24.2,您可以按照以下步骤进行操作: 1. 首先,确保您的计算机系统满足Mendix 9.24.2的系统要求。您可以在Mendix官方网站上找到这些要求。 2. 在Mendix官方网站上下载Mendix 9.24.2的安装程序。安装程序通常是一个可执行文件,具有.msi文件扩展名。 3. 双击安装程序,开始安装过程。您可能需要管理员权限才能执行此操作。 4. 跟随安装向导的指示进行操作。通常,您需要同意许可协议、选择安装目录和组件,并选择其他选项,如更新现有安装或创建桌面快捷方式。 5. 完成安装后,您可以在安装目录中找到Mendix 9.24.2的安装文件。您可以选择在桌面上创建快捷方式,以方便您访问平台。 6. 打开Mendix 9.24.2,您将被要求登录或注册。如果已经有一个Mendix账户,您可以使用该账户登录。否则,您需要注册一个新账户。 7. 登录后,您可以开始使用Mendix 9.24.2进行低代码应用开发。您可以使用平台的各种工具和功能,创建自定义应用程序,连接数据源,设计用户界面等等。 总的来说,安装Mendix 9.24.2是一个比较简单的过程。只要您按照安装向导的指示进行操作,您应该能够成功安装和启动Mendix 9.24.2,开始使用这个强大的低代码开发平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值