Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)
神仙调整+乱搞题。
首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发。
首先将 \(a_i\) 从小到大排序。我们考虑将分配的点对看作一条条线,对于 \(a_x+a_y<M\) 的点对 \((x,y)\) 我们在 \(x,y\) 之间连一条蓝线,对于 \(a_x+a_y\ge M\) 的点对我们在 \(x,y\) 之间连一条红线。
先抛结论,再给证明:如在最优分配方式中,我们的连线方式肯定是长这样的:
证明:使用调整法,证明上述命题,等价于证明对于以下 \(7\) 种情况,左边的情况都可以被调整为右边的情况且答案不会更劣(这里借用了粉兔题解中的图):
我们考虑一一对其进行证明,为了表述方便我们统一假设从左到右四个点分别为 \(a_p,a_q,a_r,a_s\),则显然 \(a_p\le a_q\le a_r\le a_s\):
- 对于左边第一个的情况,左边的最大值为 \(\max(a_p+a_q,a_r+a_s)=a_r+a_s\),右边的最大值为 \(\max(a_p+a_s,a_q+a_r)\),而由于 \(a_p+a_s\le a_r+a_s,a_q+a_r\le a_r+a_s\),故右边答案不会比左边更劣。
- 对于右边第一个的情况,左边的最大值为 \(\max(a_p+a_r,a_q+a_s-M)\),而由于 \(a_s-M<0\),故 \(a_q+a_s-M<a_q<a_p+a_r\),故左边的最大值实际上是 \(a_p+a_r\),右边的最大值为 \(\max(a_p+a_q,a_r+a_s-M)\),而显然 \(a_p+a_q\le a_p+a_r,a_r+a_s-M<a_r\le a_p+a_r\),故右边答案不会比左边更劣,同时又因为 \(a_p+a_q\le a_p+a_r<M,a_r+a_s\ge a_q+a_s\ge M\),故 \(a_p,a_q\) 之间连的依旧是蓝线,\(a_r,a_s\) 之间连的依旧是红线。
- 对于左边第二个的情况,左边的最大值为 \(a_q+a_s\),右边的最大值为 \(\max(a_p+a_s,a_q+a_r)\),而 \(a_p+a_s\le a_q+a_s,a_q+a_r\le a_q+a_s\),故右边答案不会比左边更劣。
- 对于右边第二个的情况,左边的最大值为 \(\max(a_p+a_s,a_q+a_r-M)=a_p+a_s\),右边的最大值为 \(\max(a_p+a_q,a_r+a_s-M)\),又由于 \(a_p+a_q\le a_p+a_s,a_r+a_s-M<a_r\le a_p+a_s\),故右边答案不会比左边更劣。
- 对于左边第三、四个的情况,证明方法同左边第一、二个,只不过需要整体减个 \(M\)。
- 对于右边第三个的情况,左边最大值为 \(\max(a_q+a_r,a_p+a_s-M)=a_q+a_r\),右边最大值为 \(\max(a_p+a_q,a_r+a_s-M)\),又由于 \(a_p+a_q\le a_q+a_r,a_r+a_s-M<a_r\le a_q+a_r\),故右边答案不会比左边更劣。
综上,只要出现线相交或者不同颜色的线出现包含关系的情况,都可以被调整,证毕。
接下来考虑怎样求答案,暴力枚举分割点显然是不可行的,不过注意到对于两个不同且均合法的分割点 \(p\) 和 \(p'\),如果 \(p<p'\),那么以 \(p\) 为分割点的每条线的权值都小于以 \(p'\) 为分割点的每条线的权值,因此我们肯定希望分割点越靠左越好,而如果我们分割点太左了(yyq:政治学得很好嘛),那就会出现右侧有的线不是红线的情况,因此我们可以二分找出合法的且最靠左的分割点 \(p\),然后求出答案即可。
时间复杂度线性对数。
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
template<typename T> void print(T x,char c){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);putc(c);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
using namespace fastio;
const int MAXN=1e5;
int n,m,a[MAXN*2+5];
int add(int x,int y){return (x+y<m)?(x+y):(x+y-m);}
bool check(int mid){bool flg=1;for(int i=(mid<<1)+1;i<=n<<1;i++) flg&=(a[i]+a[(n<<1)+(mid<<1)+1-i]>=m);return flg;}
int main(){
read(n);read(m);
for(int i=1;i<=n<<1;i++) read(a[i]);
sort(a+1,a+(n<<1)+1);int l=0,r=n,p=-1;
while(l<=r){
int mid=l+r>>1;
if(check(mid)) p=mid,r=mid-1;
else l=mid+1;
} int mx=0;
// printf("%d\n",p);
for(int i=1;i<=p<<1;i++) chkmax(mx,add(a[i],a[(p<<1)+1-i]));
for(int i=(p<<1)+1;i<=n<<1;i++) chkmax(mx,add(a[i],a[(n<<1)+(p<<1)+1-i]));
printf("%d\n",mx);
return 0;
}
Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)的更多相关文章
- Atcoder Grand Contest 032
打的第一场Atcoder,已经知道会被虐得很惨,但没有想到竟然只做出一题-- 思维急需提升. A - Limited Insertion 这题还是很签到的. 感觉正着做不好做,我们反着来,把加数变为删 ...
- AtCoder Grand Contest 032 A - Limited Insertion( 思维)
Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement Snuke has an empty ...
- AtCoder Grand Contest 032 B - Balanced Neighbors——构造
题意 B - Balanced Neighbors 给定一个整数 $N$($3\leq N \leq 100$),构造一个顶点编号为 $1...N$ 的无向图,需满足如下两个条件: 简单图且连通 存在 ...
- Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)
Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- AtCoder Grand Contest 010
AtCoder Grand Contest 010 A - Addition 翻译 黑板上写了\(n\)个正整数,每次会擦去两个奇偶性相同的数,然后把他们的和写会到黑板上,问最终能否只剩下一个数. 题 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
随机推荐
- C++编译Dlib库出现LNK2001错误(原因是在Python中安装过Dlib)
问题 使用CMake编译Dlib库,编译得到lib文件后,新建一个VS工程想使用Dlib,却出现LNK2001:无法解析的外部符号的错误,且都与JPEG和PNG相关: 1>dlib19.17.9 ...
- 第2次 Beta Scrum Meeting
本次会议为Beta阶段第2次Scrum Meeting会议 会议概要 会议时间:2021年5月31日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下 ...
- Codeforces Round #573 (Div. 2) D题题解
一.题目 Tokitsukaze, CSL and Stone Game Tokitsukaze和CSL正在玩一些石头游戏. 一开始,有n堆的石头,第i堆石头数记为 \(a_i\),两人轮 ...
- TDengine在数益工联工业物联采集平台建设中的初步实践
作者:易永耀 夏杭泰 邓炜兴 公司介绍 数益工联致力于打造基于数据流+价值流的离散制造业数字化软件:应用新一代的物联网技术与丰富的现场交互手段,融合工业工程精益思想,为离散制造业客户的数字化升级提供从 ...
- hystrix的配置说明
在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统 ...
- Noip模拟35 2021.8.10
考试题目变成四道了,貌似确实根本改不完... 不过给了两个小时颓废时间确实很爽(芜湖--) 但是前几天三道题改着不是很费劲的时候为什么不给放松时间, 非要在改不完题的时候颓?? 算了算了不碎碎念了.. ...
- 野指针和free总结超有用的资料
在C语言项目中,经常会遇到需要程序员手动分配内存的地方.这样做能够节省大量的内存空间,也让程序更加灵活.只要你有一定的基础,那么肯定用过 malloc 或者 ralloc和free的组合.这个组合使用 ...
- C语言中都有哪些常见的数据结构你都知道几个??
上次在面试时被面试官问到学了哪些数据结构,那时简单答了栈.队列/(ㄒoㄒ)/~~其它就都想不起来了,今天有空整理了一下几种常见的数据结构,原来我们学过的数据结构有这么多~ 首先,先来回顾下C语言中常见 ...
- 嵌入式大佬给你分析stm32串口
stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...
- 排序算法:Java实现希尔排序
希尔排序的思路是先分组再整合 先对下标进行分组,比如当数组长度为20时,一开始选定一个间隔值为10 对数组进行排序,每隔10个元素比较大小并交换,以下标为间隔,1和11比较.2和12比较......1 ...