您的位置:首页 > 大数据 > 人工智能

2017 Multi-University Training Contest 5 solutions 1006 Rikka with Graph

2017-08-10 09:23 465 查看
考虑贪心地一条一条边添加进去。

当 m≤n−1m≤n−1 时,我们需要最小化距离为 nn 的点对数,所以肯定是连出一个大小为 m+1m+1 的联通块,剩下的点都是孤立点。在这个联通块中,为了最小化内部的距离和,肯定是连成一个菊花的形状,即一个点和剩下所有点直接相邻。

当 m>n−1m>n−1 时,肯定先用最开始 n−1n−1 条边连成一个菊花,这时任意两点之间距离的最大值是 22。因此剩下的每一条边唯一的作用就是将一对点的距离缩减为 11。

这样我们就能知道了最终图的形状了,稍加计算就能得到答案。要注意 mm 有可能大于 n(n−1)2​2​​n(n−1)​​。

#include <cstdio>
#include <iostream>
using namespace std;
long long int ans;
long long int maxm;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n,m;
scanf("%lld%lld",&n,&m);
ans=n*(n-1);
maxm=ans/2;
if(m>=maxm) printf("%lld\n",ans);
else if(m>=n-1)
printf("%lld\n",ans+(maxm-m)*2);
else
printf("%lld\n",n*(n-m-1)*(n+m)+2*m*m);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐