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\). ...
随机推荐
- 用例图示例:使用系统边界表示多个项目 / Using System Boundary to model Multiple Projects in Use Case Diagram
什么是用例图? 用例是一种捕获系统功能需求的技术.用例描述了一个独立于实现细节的期望行为.用例的目标是捕获用户设想的所有系统级功能.从用户的角度来看,用例是关于系统应该做什么的.用例捕获系统利益相关者 ...
- linux下创建文件的文件权限问题
今天发现创建文件的权限和自己规定的权限不一致,了解到了权限掩码的问题,这里总结一下. 首先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常我们都 ...
- linux exit 和 _exit的区别
今天仔细看了一下exit和_exit这两个函数的区别,实际上exit也是调用了_exit退出函数的,只不过在调用_exit之前,exit还进行了一些多余的工作,也正是因为这样,相比起来exit就没有那 ...
- 最后的OI(HAOI2020游记)
马上就省选了,怎么不得写点什么?要不然到最后或许就真的落得个白茫茫大地真干净的局面. 其实也不知道该说啥?我这一路走来,感觉挺赚的. 每一个OIer背后都有一个故事,所以,我有故事,你有酒吗? 依稀记 ...
- DeWeb --- Hello,World!
1.新建一个DLL,命名为hello.dpr 2.新增一个Form.(File->New->VCL Form - Delphi),建议不要更改单元名称和Form名称,即分别为unit1.p ...
- Linux cat文件正常,vim文件乱码
cat: vim: 1.临时解决 vim 文件后,命令模式下执行: :set encoding=utf-8 2.永久解决 vi 配置文件路径:/etc/virc vim 配置文件路径:/etc/ ...
- RocketMQ源码详解 | Broker篇 · 其三:CommitLog、索引、消费队列
概述 上一章中,已经介绍了 Broker 的文件系统的各个层次与部分细节,本章将继续了解在逻辑存储层的三个文件 CommitLog.IndexFile.ConsumerQueue 的一些细节.文章最后 ...
- 羽夏看Win系统内核——SourceInsight 配置 WRK
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- Maven 问题 Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:3.0.0-M1 的处理
一.问题描述 Maven项目报错,该项目是导入的项目,然后再通过开发工具打开项目时,pom.xml文件报错. 并且新建Maven Project 也会报错. 二.报错详细Failure to tran ...
- Invalid prop: type check failed for prop "xxx". Expected Number, got String.
在子组件progress-circle.vue的template中的定义如下: <svg :width="radius" :height="radius" ...