题意:问你n个点的情况构造一个图使得这个图的边最多(这个图需要满足桥的数量大于等于边总数的一半)
解:
1、考虑图中构造一部分内部尽量多的边,对这一份的外部的点,这个分量只和外部每个点只有一条边。
那么 考虑这部分的大小是k,
若想满足桥的数量至少一半那么
该部分分量的边也就是非桥边不可以超过桥边
所以边的数量为f(k)==min(n-k,k*(k-1)/2)+n-k;
画图知f(k)为上凸函数满足三分性质
#include<bits/stdc++.h> #define en '\n' #define ll long long using namespace std; const ll inf=0x3f3f3f3f; const ll maxn = 1e5+3; const ll maxm=maxn<<2; ll n; ll rd(){ ll tem;scanf("%I64d",&tem);return tem; } ll f(ll x){ ll tem1; if(x&1){tem1=x*((x-1)>>1);} else tem1=(x>>1)*(x-1); ll tem2=n-x; return min(tem1,tem2)+(n-x); } signed main() { #ifdef local freopen("input2.txt","r",stdin); #endif ll q=rd(); while(q--){ n=rd(); ll l=0,r=n; if(n==1){ cout<<0<<en; continue; } while(l+1<r){ ll lmid=(l+r)>>1; ll rmid=(lmid+r)>>1; if(f(lmid)>f(rmid)){ r=rmid; }else{ l=lmid; } } cout<<f(l)<<en; } return 0; }