首页 > 其他分享 >[CF704E] Iron man

[CF704E] Iron man

时间:2023-12-11 22:45:41浏览次数:24  
标签:dep CF704E tp st int Iron op itr man

题目链接

树的情况不好做。先树剖,现在变成了链的问题。

考虑对时间扫描线,会发现所有人的相对顺序变化的时候,就是有人相遇了。所以他的相对顺序可以用一个 set 维护。而将会相遇的人一定是插入时相对顺序相邻的人,可以 check 一下取个最小值。可以把时间线设成全局变量,这样就可以跑 set 的排序了。

// LUOGU_RID: 136377501
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const double eps=1e-10;
int n,m,u,v,fa[N],sz[N],son[N],dep[N],tp[N];
double tme,ans=1e9;
vector<int>g[N];
struct node{
	int l;
	double op,s,t;
	double ask(double t)
	{
		return l+op*(t-s);
	}
	bool operator<(const node&n)const{
		return l+op*(tme-s)<n.l+n.op*(tme-n.s);
	}
};
struct caozuo{
	double t;
	int op;
	node x;
	bool operator<(const caozuo&c)const{
		if(fabs(t-c.t)>=eps)
			return t<c.t;
		return op>c.op;
	}
}st[N<<1];
vector<node>h[N];
set<node>s;
void dfs(int x,int y)
{
	dep[x]=dep[y]+1;
	fa[x]=y;	
	sz[x]=1;
	for(int v:g[x])
	{
		if(v^y)
		{
			dfs(v,x),sz[x]+=sz[v];
			if(sz[v]>sz[son[x]])
				son[x]=v;
		}
	}
}
void sou(int x,int y,int p)
{
	tp[x]=p;
	if(son[x])
		sou(son[x],x,p);
	for(int v:g[x])
		if(v^y&&v^son[x])
			sou(v,x,v);
}
int dis(int u,int v)
{
	int ans=0;
	while(tp[u]^tp[v])
	{
		if(dep[tp[u]]<dep[tp[v]])
			swap(u,v);
		ans+=dep[u]-dep[fa[tp[u]]];
		u=fa[tp[u]];
	}
	ans+=abs(dep[u]-dep[v]);
	return ans;
}
void add(int u,int v,int t,double c)
{
	double cu=t,cv=t+dis(u,v)/c;
	while(tp[u]^tp[v])
	{
		if(dep[tp[u]]>dep[tp[v]])
		{
			h[tp[u]].push_back((node){dep[u]-dep[fa[tp[u]]],-c,cu,cu+(dep[u]-dep[tp[u]]+1)/c});
			cu+=(dep[u]-dep[tp[u]]+1)/c;
			u=fa[tp[u]];
		}
		else
		{
			h[tp[v]].push_back((node){0,c,cv-(dep[v]-dep[tp[v]]+1)/c,cv});
			cv-=(dep[v]-dep[tp[v]]+1)/c;
			v=fa[tp[v]];
		}
	}
	if(dep[u]<dep[v])
		h[tp[u]].push_back((node){dep[u]-dep[tp[u]]+1,c,cu,cv});
	else
		h[tp[v]].push_back((node){dep[u]-dep[tp[u]]+1,-c,cu,cv});
}
void chk(node x,node y)
{
	double t=min(x.t,y.t);
	if(x.ask(t)-y.ask(t)>=-eps)
	{
		if(x.op==y.op)
			ans=min(ans,max(x.s,y.s));
		else
			ans=min(ans,(x.l-y.l+y.op*y.s-x.op*x.s)/(y.op-x.op));
	}
}
mt19937 gen(time(0));
int main()
{
//	n=1000,m=1024;
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
//		u=i+1,v=gen()%i+1;
		g[u].push_back(v),g[v].push_back(u);
	}
	dfs(1,0);
	sou(1,0,1);
	while(m--)
	{
		int u,v,t,c;
//		t=gen()%1000,c=gen()%100,u=gen()%n+1,v=gen()%n+1;
		scanf("%d%d%d%d",&t,&c,&u,&v);
		add(u,v,t,c);
	}
	for(int i=1;i<=n;i++)
	{
		if(tp[i]^i)
			continue;
		int m=0;
		for(node j:h[i])
			st[++m]=(caozuo){j.s,1,j},st[++m]=(caozuo){j.t,-1,j};
		sort(st+1,st+m+1);
		s.clear();
		for(int j=1;j<=m;j++)
		{
			if(st[j].t-ans>-eps)
				break;
			tme=st[j].t;
			set<node>::iterator itl,itr;
			if(st[j].op==-1)
			{
				s.erase(s.lower_bound(st[j].x));
				itr=s.lower_bound(st[j].x);
				if(itr!=s.begin()&&itr!=s.end())
				{
					itl=--itr;
					++itr; 
					chk(*itl,*itr);
				}
			}
			else
			{
				itr=s.lower_bound(st[j].x);
				if(itr!=s.end())
					chk(st[j].x,*itr);
				if(itr!=s.begin())
					chk(*(--itr),st[j].x);
				s.insert(st[j].x);
			}
		}
	}
	if(ans==1e9)
		puts("-1");
	else
		printf("%.10lf",ans);
}

标签:dep,CF704E,tp,st,int,Iron,op,itr,man
From: https://www.cnblogs.com/mekoszc/p/17895762.html

相关文章

  • 无涯教程-MFC - Command Button函数
    命令按钮是常规按钮的增强版本,它在左侧显示一个绿色箭头图标,后跟一个常规尺寸的标题,在主标题下,它可以显示另一个较小的标题,作为提示以提供更多信息。这是命令按钮控件的消息映射列表-MessageMapentry描述BN_CLICKEDON_BN_CLICKED(<id>,<memberFxn>)单击按钮时,框架将调......
  • 堪比Postman!实用IDEA插件推荐
    Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:ApipostHelper,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。更重要的是他完全免费!Apipost......
  • Sam Altman当选“TIME时代周刊”2023年度最佳CEO!还有梅西、Taylor Swift当选...
    TIME时代周刊昨日在官网公布了2023年最佳CEO——SamAltman当选!此外,TaylorSwift当选年度最佳人物,梅西当选年度最佳运动员。SamAltman的当选可谓是实至名归!没有谁能比火爆全球的ChatGPT背后,OpenAI的CEO更“成功”了。今年SamAltman成功实现两次爆火,第一次是ChatGPT的发布,如果说......
  • 堪比Postman!实用IDEA插件推荐
    Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:ApipostHelper,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。更重要的是他完全免费!Apipos......
  • Performance Improvements in .NET 8 & 7 & 6 -- Thread【翻译】
    线程.NET的最近版本在线程、并行、并发和异步等方面做出了巨大的改进,例如ThreadPool的完全重写(在.NET6和.NET7中),异步方法基础设施的完全重写(在.NETCore2.1中),ConcurrentQueue的完全重写(在.NETCore2.0中)等等。这个版本没有包含这样的大规模改革,但它确实包含了一......
  • Sermant:无代理服务网格架构解析及无门槛玩转插件开发
    本文分享自华为云社区《Sermant:无代理服务网格架构解析及无门槛玩转插件开发》,作者:华为云社区精选。本期直播的主题是《从架构设计到开发实践,深入浅出了解Sermant》,华为云云原生DTSE技术布道师、华为云高级工程师、Sermant开源社区PMC核心成员栾文飞,为广大开发者详细从架构设计......
  • 【题解】AtCoder abc332_g Not Too Many Balls
    传送门:https://atcoder.jp/contests/abc332/tasks/abc332_g看完题,第一眼反应为最大流。建模方式为:以颜色为左部点,盒子为右部点,源点$S$向颜色$i$连一条容量为$A_i$的边,盒子$j$向汇点$T$连一条容量为$B_j$的边,颜色$i$向盒子$j$连一条容量为$ij$的边;在这张图......
  • "firmwarepasswd": MacOS Firmware Password Management: CHECK and DELETE Macbook P
    Abaels-MacBook-Pro:~abaelhe$suPassword:bash-3.2#firmwarepasswd-checkPasswordEnabled:Yesbash-3.2#firmwarepasswd-deleteDeleteFirmwarePasswordEnterpassword:PasswordremovedNOTE:MustrestartbeforechangeswilltakeeffectUsage:firmw......
  • allure commandline 命令行参数
    一、allurehtml产生流程方法一:alluregenerate+allureopen方法二:allureserver二、语法格式generateopenserver参考资料本文地址:https://www.cnblogs.com/hchengmx/p/17892977.html一、allurehtml产生流程Step1.test文件运行后产生allure-results文......
  • PowerShell原生命令Get-Command探索
    前一篇博文我们提到Get-Command输出的类型(CommandType)有三类(别名,功能和命令),但通过查看帮助我们却发现命令类型似乎不只这三种,如下图:从输出的帮助信心我们看到命令类型还有Filter,ExternalScript,application和Script。通过执行如下命令:get-command-CommandTypeapplication|get-me......