题意

原题

给出\(2n\)个\(\leq m\)的数,求最优的两两配对方案

使\(n\)组\((x,y)\)的\((x+y)mod \space m\)最大值最小

\(n\leq 10^5,m \leq 10^9\)

思路

排序后大胆猜测

发现结论是: 一定存在一种最优解,使得以某个位置为界,两边分别首尾匹配,且满足左边的每一对的和都\(<m\), 右边每一对的和都\(≥m\).

证明可以看题解,大概因为每一种别的形式的解都可以转化到它,一定的等价或更优的

这样子我们就容易得到\(O(n^2)\)的枚举+判断的写法

接着发现:

  • 界线越左,左边的每一对越容易变成第一类(数都变小了)。
  • 界线越左,右侧的每一对越难变第二类。
  • 在满足条件情况下,界线越左,最大值就越小。
  • 如果左边不满足,右边一定是满足(因为右边的数都比左边大加起来任然\(<m\),右边一定全部\(<m\))

也就是界线是可以二分的,所以就做完了

#include <bits/stdc++.h>
using std::max;
using std::min;
int n,m,a[200005],ans=0,Ans;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n*2;i++)
scanf("%d",&a[i]);
std::sort(a+1,a+2*n+1);
int l=0,r=n;
while (l<=r){
int mid=(l+r)>>1;
bool f=true;
int t=mid<<1;
int ans=0;
if (f) for(int i=t+1,j=2*n;i<j;i++,j--)
if (a[i]+a[j]<m){
f=false;break;
}
if (f){
Ans=mid;
r=mid-1;
}else l=mid+1;
}
int t=Ans*2;
for (int i=1;i<=Ans;i++) ans=max(ans,a[i]+a[t-i+1]);
for(int i=t+1,j=2*n;i<j;i++,j--) ans=max(ans,a[i]+a[j]-m);
printf("%d\n",ans);
}

后记

连二分都能写错的我。。。

AGC032E modulo pairing的更多相关文章

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

    题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_e 题解 猜结论好题. 结论是: 按\(a_i\)从小到大排序之后,一定存在一种最优解,使得以 ...

  2. 「AGC032E」 Modulo Pairing

    「AGC032E」 Modulo Pairing 传送门 如果所有数都 \(<\lfloor \frac m 2\rfloor\),一个自然的想法是对所有数排序过后大小搭配,这样显然是最优秀的. ...

  3. Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)

    Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...

  4. Atcoder Grand Contest 032

    打的第一场Atcoder,已经知道会被虐得很惨,但没有想到竟然只做出一题-- 思维急需提升. A - Limited Insertion 这题还是很签到的. 感觉正着做不好做,我们反着来,把加数变为删 ...

  5. 【AtCoder】AGC032

    AGC032 A - Limited Insertion 这题就是从后面找一个最靠后而且当前可以放的,可以放的条件是它的前面正好放了它的数值-1个数 如果不符合条件就退出 #include <b ...

  6. cf319.B. Modulo Sum(dp && 鸽巢原理 && 同余模)

    B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. codeforces 577B B. Modulo Sum(水题)

    题目链接: B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. POJ1995 Raising Modulo Numbers

    Raising Modulo Numbers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6373   Accepted: ...

  9. Question about pairing/bonding?

    Except that on android you can bypass the pairing dialog if you know the PIN in advance through a di ...

随机推荐

  1. 第一讲,DOS头文件格式

    今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 简短的说明. 我们要知道,PE文件格式,是微 ...

  2. Unity 屏幕坐标到UGUI RectTransform本地坐标的转换

    public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camer ...

  3. asp.net core In Docker(Image)

    原文地址:https://www.cnblogs.com/stulzq/p/9059108.html 大家应该知道目前.NET Core(2.0)还是没有System.Drawing程序集,如果我们要 ...

  4. [NOIP10.5模拟赛]1.a题解--离散化+异或线段树

    题目链接: 咕咕咕 https://www.luogu.org/problemnew/show/CF817F 闲扯 在Yali经历几天折磨后信心摧残,T1数据结构裸题考场上连暴力都TM没打满 分析 观 ...

  5. css样式背景图片设置缩放

    一.背景颜色图片平铺 background-color 背景颜色 background-image 背景图片地址 background-repeat 是否平铺 默认是平铺 background-pos ...

  6. python初始化定长列表

    >>> lst = ['x' for n in range(5)] >>> print(lst) ['x', 'x', 'x', 'x', 'x'] >> ...

  7. 什么时候用assert

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证 ...

  8. 理解 chroot

    什么是 chroot chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的. ...

  9. 微信小程序开发(六)获取手机信息

    // succ.js var app = getApp() Page({ data: { mobileModel: '', // 手机型号 mobileePixelRatio: '', // 手机像素 ...

  10. Maven 安装依赖包

    Guide to installing 3rd party JARs Although rarely, but sometimes you will have 3rd party JARs that ...