1. 程式人生 > >Rikka with Graph hdu 6090

Rikka with Graph hdu 6090

pre mat 一個 fix hdu cin html bin cstring

題解:考慮貪心地一條一條邊添加進去。

m \leq n-1mn?1 時,我們需要最小化距離為 nn 的點對數,所以肯定是連出一個大小為 m+1m+1 的聯通塊,剩下的點都是孤立點。在這個聯通塊中,為了最小化內部的距離和,肯定是連成一個菊花的形狀,即一個點和剩下所有點直接相鄰。

m > n-1m>n?1 時,肯定先用最開始 n-1n?1 條邊連成一個菊花,這時任意兩點之間距離的最大值是 22。因此剩下的每一條邊唯一的作用就是將一對點的距離縮減為 11。

這樣我們就能知道了最終圖的形狀了,稍加計算就能得到答案。要註意 mm 有可能大於 \frac{n(n-1)}{2}?2??n(n?1)??

隊友給力,手速快,賽後補代碼都補了20多分鐘,,, 果然自己代碼實現能力還是弱渣。

AC代碼:

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
typedef long long ll;
ll get(ll n)
{
    ll temp=n-1ll;
    temp+=(n-1ll)*((2ll)*n-3ll);
    return temp;
}
int main()
{
    int t;
    cin
>>t; while(t--) { ll n,m; scanf("%lld %lld",&n,&m); ll ans=0; m=min(m,(n-1ll)*n/2ll); if(m <= n-1) { ans+=get(m+1); ll temp=n-m-1; ans+=temp*(m+1)*n*2; ans+=(temp-1ll)*temp*n; cout
<<ans<<endl; } else { ll temp=get(n)-(m-(n-1))*2; cout<<temp<<endl; } } return 0; }

Rikka with Graph hdu 6090