首页 > 其他分享 >AT_keyence2019_e Connecting Cities 题解

AT_keyence2019_e Connecting Cities 题解

时间:2024-12-23 11:20:49浏览次数:7  
标签:题解 ll 200010 second Connecting pair Cities id make

题目传送门

前置知识

Boruvka 算法

解法

考虑 Boruvka 算法。

拆掉绝对值后得到 \(a_{i}+id,a_{i}-id,a_{j}+id,a_{j}-id\) 四个式子。

vector 启发式合并辅助线段树查询的常数过大,无法通过。上述做法的常数在于一条边会被计算两次,考虑优化。

不妨直接钦定向前连、向后连的贡献,顺次扫的过程中是容易维护的。做法正确性由最优解一定包含与其中可以保证。

代码

ll a[200010],b[200010],c[200010],f[200010];
pair<ll,ll>g[200010];
multiset<pair<ll,ll> >s;
struct DSU
{
	ll fa[200010];
	void init(ll n)
	{
		for(ll i=1;i<=n;i++)
		{
			fa[i]=i;
		}
	}
	ll find(ll x)
	{
		return fa[x]==x?x:fa[x]=find(fa[x]);
	}
	void merge(ll x,ll y)
	{
		x=find(x);
		y=find(y);
		if(x!=y)
		{
			fa[x]=y;
		}
	}
}D;
ll boruvka(ll n)
{
	D.init(n);
	ll ans=0,flag=1,x;
	while(flag==1)
	{
		flag=0;
		fill(g+1,g+1+n,make_pair(0,0x3f3f3f3f3f3f3f3f));
		s.clear();
		for(ll i=1;i<=n;i++)
		{
			f[i]=0x3f3f3f3f3f3f3f3f;
			s.insert(make_pair(f[i],i));
		}
		for(ll i=1;i<=n;i++)
		{
			x=D.find(i);
			s.erase(make_pair(f[x],x));
			if(s.empty()==0&&s.begin()->first+c[i]<g[x].second)
			{
				g[x].first=s.begin()->second;
				g[x].second=s.begin()->first+c[i];
			}
			f[x]=min(f[x],b[i]);
			s.insert(make_pair(f[x],x));
		}
		s.clear();
		for(ll i=1;i<=n;i++)
		{
			f[i]=0x3f3f3f3f3f3f3f3f;
			s.insert(make_pair(f[i],i));
		}
		for(ll i=n;i>=1;i--)
		{
			x=D.find(i);
			s.erase(make_pair(f[x],x));
			if(s.empty()==0&&s.begin()->first+b[i]<g[x].second)
			{
				g[x].first=s.begin()->second;
				g[x].second=s.begin()->first+b[i];
			}
			f[x]=min(f[x],c[i]);
			s.insert(make_pair(f[x],x));
		}
		for(ll i=1;i<=n;i++)
		{
			x=D.find(i);
			if(g[x].first!=0&&D.find(x)!=D.find(g[x].first))
			{
				D.merge(x,g[x].first);
				ans+=g[x].second;
				flag=1;
			}
		}
	}
	return ans;
}
int main()
{
// #define Isaac
#ifdef Isaac
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	ll n,d,i;
	cin>>n>>d;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		b[i]=a[i]-i*d;
		c[i]=a[i]+i*d;
	}
	cout<<boruvka(n)<<endl;
	return 0;
}

标签:题解,ll,200010,second,Connecting,pair,Cities,id,make
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18623583

相关文章

  • .net framework 4.7.2 winform框架项目升级到.net 8.0项目 界面比列失调问题解决
    一、问题发生前:在.netframework4.7.2winform框架开发的项目之前在.netframework4.7.2开发的winform项目,在visualstudio一打开的时候,虽然界面内有些控件也会失调,但是他会提示“使用100%缩放比例重新启动VisualStudio”点击“使用100%缩放比例重新启动VisualStudio”......
  • 题解 - 换位置游戏
    题目描述N个小朋友(编号为1到N)正在玩一个换位置游戏。从左到右依次排列着N个凳子(编号为1到N,最左边的为1号凳子,最右边的为N号凳子),每个凳子上都有一个数字(凳脚处红色数字),每个数字互不相同,且都是不超过N的正整数。游戏开始前,1号小朋友坐在1号凳子上,2号小......
  • push代码报错fatal: Authentication failed的问题解决
    在不使用pat之前,我的centos系统不能向github提交代码,然后我在github上申请了pat并且配置,可以成功提交代码了,而且还免除了输入用户名和密码的麻烦。如何申请pat(咨询文心快码就可以得到答案):如何在git上配置pat(继续咨询文心快码):配置完成之后,问题得到解决,现在可以正常的push代码......
  • 题解:P11410 闪耀之塔
    题解:P11410闪耀之塔https://www.luogu.com.cn/problem/P11410我们要想讲讲前置知识——蒙哥马利快速幂模求逆元。前置知识逆元定义何为逆元?逆元,又称数论倒数。若整数\(a\)、\(b\)满足同余方程\(a*b=1(mod\n)\),那么\(a\),\(b\)互为模\(n\)意义下的逆元。前置\(......
  • 题解:AT_abc294_g [ABC294G] Distance Queries on a Tree
    题目链接https://www.luogu.com.cn/problem/AT_abc294_g分析先不考虑修改。设\(dist_i\)表示从根节点到第\(i\)号节点的距离,\(\operatorname{lca(u,v)}\)表示树上两点\(u,v\)的最近公共祖先,那么\(u,v\)两点间的距离就是\((dist_{\operatorname{lca(u,v)}}-dist_u)+(......
  • CSharp: Connecting to Oracle 11g Database in C#
     usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;//usingOracle.DataAccess.Client;usin......
  • CF2040D 题解
    构造题做得较少,所以性质观察得较慢。值域给的\(2n\)非常诡异,想到考虑\(2\)的倍数。按深度记录下每层结点,发现隔一层依次按\(2\)的倍数填充,即可满足。即:先填奇数层,再填偶数层。但是连续的偶数是不能相邻的,发现当深度在\([2,4]\)时,无论以何顺序按层填充,都会有问题。处......
  • 洛谷 P11411 兰奇的卡牌游戏——题解
    洛谷P11411兰奇的卡牌游戏传送锚点摸鱼环节兰奇的卡牌游戏题目描述作为制卡大师的兰奇,发明了一种自助型卡牌游戏。给定\(n\)张卡牌,第\(i\)张卡牌编号为\(i\),其权值为\(a_i\),卡牌的权值互不相同。这个卡牌游戏的规则需要自己生成。一开始,所有的牌都在备选区。从备选......
  • python: Connecting to Oracle 11g Database in Python
     #encoding:utf-8#版权所有2024涂聚文有限公司#许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎#描述:python-mpipinstalloracledb#python-mpipinstallcx_Oracle--upgrade#pipinstallcx_Oracle#Author:geovindu,GeovinDu涂聚文.#......
  • CF1548A Web of Lies 题解
    WebofLies题解洛谷。Codeforces。题意比较直接,就不复述了。思路分析题意首先根据操作3,删人只是暂时的,可以分析出每次删的人对于后面都没有影响。关注到这个词:执行以下操作直至不可再执行为止。显然,在整个图中所有该被删除的人都逃不掉,迟早被删除。那么看看什么样......