agc062d
csy/bx wjz/bx
首先将
先发现一个 trivial 的事情,就是答案一定位于
现在考虑枚举这个半径
从全局的角度考虑,因为
- 如果
y 不存在,那么相当于我们要将\le d 的元素分成两部分,大小分别\ge x-d,\ge d ,直接 bitset 优化背包找到可能组合出来的和然后在里面_Find_next即可。 - 如果
y 存在,那么要求分成的两部分大小分别\ge x-d,\ge y-d ,同理 bitset 做。
时间复杂度
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=2e5;
int n,a[MAXN+5];bitset<MAXN+5>f;
int main(){
scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);ll sum=0;for(int i=1;i<n;i++)sum+=a[i];
if(sum<a[n])return puts("-1"),0;
f[0]=1;
for(int i=a[n]/2,j=0,s=0;i<=a[n];i++){
while(j<n&&a[j+1]<i)f|=(f<<a[++j]),s+=a[j];
int x=a[j+1]-i,y=(j==n-1)?i:(a[j+2]-i),pos=f._Find_next(x-1);
if(s-pos>=y)return printf("%d\n",i),0;
}
return 0;
}