hdu 多校联赛 Rikka with Graph

Rikka with Graph

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 0    Accepted Submission(s): 0


Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

For an undirected graph  G with  n nodes and  m edges, we can define the distance between  (i,j) ( \text{dist}(i,j)) as the length of the shortest path between  i and  j. The length of a path is equal to the number of the edges on it. Specially, if there are no path between  i and  j, we make  \text{dist}(i,j) equal to  n.

Then, we can define the weight of the graph  G ( w_G) as  \sum_{i=1}^n \sum_{j=1}^n \text{dist}(i,j) .

Now, Yuta has  n  nodes, and he wants to choose no more than  m  pairs of nodes  (i,j)(i \neq j)  and then link edges between each pair. In this way, he can get an undirected graph  G  with  n  nodes and no more than  m  edges.

Yuta wants to know the minimal value of  w_G .

It is too difficult for Rikka. Can you help her?  

In the sample, Yuta can choose  (1,2),(1,4),(2,4),(2,3),(3,4) .
 

Input
The first line contains a number  t(1 \leq t \leq 10) , the number of the testcases. 

For each testcase, the first line contains two numbers  n,m(1 \leq n \leq 10^6,1 \leq m \leq 10^{12}) .
 

Output
For each testcase, print a single line with a single number -- the answer.
 

Sample Input
  
  
1 4 5
 

Sample Output
  
  
14
 

这道题做的时候掉到坑里去了 忘了环状和链状的路径都比放射状的长度长 加上后面一个变量没用long long类型 就这么傻傻的错了十几遍 最近智商下降有点严重(┬_┬)、、

ac代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,m;
        long long ans=0;
        scanf("%lld%lld",&n,&m);
        if(m>=n)
        {
            if(n*(n-1)/2<=m)
                {ans=n*(n-1);
                }
            else if(n*(n-1)/2>m)
                {ans=n*(n-1)+(n*(n-1)/2-m)*2;
                }
        }
        else if(m==n-1)
        {
            ans=(n-2)*(n-1)*2+2*(n-1);
        }
        else if(m<n-1)
        {
            ans+=(m-1)*m*2+2*m;
            long long g=n-(m+1);
            ans+=g*(m+1)*n*2;
            ans+=g*(g-1)*n;
        }
        cout<<ans<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值