給乙個序列a
aa,求兩個a,b
a,ba,
b使得∑i=
1n∑j
=1nm
ax
\sum_^n\sum_^nmax\
i=1∑n
j=1∑
nma
x最小。
因為是取max
maxma
x,也就是a,b
a,ba,
b中最劣的那乙個,所以顯然有a=b
a=ba=
b。考慮如和求a
aa,不難發現其實答案就是對於每個ai+
aj
2\frac
2ai+a
j的中位數。我們可以二分答案,然後求在mid
midmi
d前有多少個ai+
aj
a_i+a_j
ai+aj
,這個顯然也可以將陣列排序後二分求得(其實不二分用指標也行)。
時間複雜度o(n
log2n
)o(n\log^2 n)
o(nlog2n
)
#include
#include
#include
#define ll long long
using
namespace std;
const ll xjq=
1e9+7;
ll n,a[
110000];
ll find
(ll x)
return r;
}ll check
(ll mid)
intmain()
ll ans=0;
for(ll i=
1;i<=n;i++
) a[i]
=abs
(a[i]*2
-l);
sort
(a+1
,a+1
+n);
for(ll i=
1;i<=n;i++
) ans+
=a[i]*(
(i-1)*
2+1)
;printf
("%lld"
,ans%xjq)
;}
牛客挑戰賽43 集合操作
神奇的題,公式可以看 已知n和m,ans c n,0 c n,1 c n,m 1 這個要分開看。c n,0 c n,1 c n,2 的含義為 長度為0,1,2的集合有這麼多種排列方法,為長度小於等於m是不會收到限制的。c n,m 1 的含義是什麼呢?舉個例子,n 6,m 2 則 1 2 3 4 5 ...
牛客挑戰賽45 C 友人 題解
題解 首先我們要知道z k z k 2 z k 則只進行一次操作的代價 r l 1 z k k z 2 r l 1 k z k 對於k z k,我們要令其盡可能的小,則z要是k的較大的子集。那麼我們列舉k的子集並儲存下來,對其排序。然後我們列舉i 0 n,直到等差數列前i個數之和大於y 對於每乙個i...
Wannafly挑戰賽1B 二分)
題解 把所有區間的異或和都求出來並且吧右端點放入陣列中,最後列舉每個區間二分查詢前面有幾個右端點的區間小於該區間的左端點,最後答案就是該總和。include include include include include include includeusing namespace std type...