Rikka with Graph hdu 6090
阿新 • • 發佈:2017-08-08
pre mat 一個 fix hdu cin html bin cstring
題解:考慮貪心地一條一條邊添加進去。
當 m \leq n-1m≤n?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