日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

AtCoder AGC032E Modulo Pairing (二分、贪心结论)

發(fā)布時(shí)間:2025/3/15 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder AGC032E Modulo Pairing (二分、贪心结论) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

https://atcoder.jp/contests/agc032/tasks/agc032_e

題解

猜結(jié)論好題。
結(jié)論是: 按\(a_i\)從小到大排序之后,一定存在一種最優(yōu)解,使得以某個(gè)位置為界,兩邊分別首尾匹配,且滿足左邊的每一對(duì)的和都\(<M\), 右邊每一對(duì)的和都\(\ge M\).
證明不難,可參考官方題解,此處不再贅述。
然后顯然可以枚舉這個(gè)臨界點(diǎn),然后\(O(n)\)暴力計(jì)算答案,時(shí)間復(fù)雜度\(O(n^2)\).
考慮優(yōu)化: 在我們配對(duì)的時(shí)候,當(dāng)臨界點(diǎn)右移,左右兩側(cè)的每一對(duì)和都會(huì)變大。
于是我們只需找到最小的合法臨界點(diǎn),即是最優(yōu)解。
二分找即可,時(shí)間復(fù)雜度\(O(n\log n)\).

代碼

#include<cstdio> #include<cstdlib> #include<iostream> #include<cassert> #include<algorithm> using namespace std;const int N = 2e5; int a[N+3]; int n,m;int main() {scanf("%d%d",&n,&m);for(int i=1; i<=n+n; i++) scanf("%d",&a[i]);sort(a+1,a+n+n+1);int left = 0,right = n;while(left<right){int mid = left+((right-left)>>1);bool ok = true;for(int i=mid*2+1; i<=n+n; i++){if(a[i]+a[n+n+mid+mid+1-i]<m) {ok = false; break;}}if(ok==true) {right = mid;}else {left = mid+1;}}int pos = 2*right;int ans = 0;for(int i=1; i<=pos; i++) ans = max(ans,a[i]+a[pos+1-i]);for(int i=pos+1; i<=n+n; i++) ans = max(ans,(a[i]+a[n+n+pos+1-i])-m);printf("%d\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的AtCoder AGC032E Modulo Pairing (二分、贪心结论)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。