把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

luogu P7521 [省选联考 2021 B 卷] 取模

题面传送门
考虑一个\(O(n^2\log n)\)的暴力。
枚举模数\(p\),然后转化\(b_i=a_i\bmod p\)并将\(b\)排序。
如果当前两个数加起来大于\(p\),则一定选\(b\)最大和次大值最优。
如果小于\(p\),那么可以双指针。
这样就是\(O(n^2\log n)\)的。
然后在考场上如果想要更多分,那么可以有一个剪枝,就是从大到小处理\(p\)并当\(p\leq Ans\)的时候就退出。
然后就过了???
然后发现这个东西大概就是每次要不值域减半,要不数组范围减半。时间复杂度就\(O(n\log n\log V)\)对了。
code:

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define re register
#define RI re int
#define ll long long
#define db double
#define lb long db
#define N (1000000+5)
#define M (N*200)+5
#define mod 1000000007
#define Mod (mod-1)
#define eps (1e-9)
#define U unsigned int
#define it iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) (n*(x-1)+(y))
#define R(n) (rand()*rand()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;
int n,A[N+5],B[N+5],R,Ans;
int main(){
	freopen("1.in","r",stdin);
	RI i,j;scanf("%d",&n);for(i=1;i<=n;i++) scanf("%d",&A[i]);sort(A+1,A+n+1);
	for(i=n;i;i--){if(A[i]<=Ans) break;if(A[i]==A[i+1]) continue;
		for(j=1;j<=n;j++) B[j]=A[j]%A[i];sort(B+1,B+n+1);Ans=max(Ans,(B[n]+B[n-1])%A[i]);
		R=1;for(j=n;j>1;j--){
			while(R<=n&&B[R+1]+B[j]<A[i]) R++;if(R==j)R--;R^1&&(Ans=max(Ans,(B[R]+B[j])));
		}
	}printf("%d\n",Ans);
}
posted @ 2022-03-03 20:32  275307894a  阅读(54)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end