CF1006C 【Three Parts of the Array】
二分查找水题
记$sum[i]$为$d[i]$的前缀和数组
枚举第一段区间的结尾$i$
然后二分出$lower$_$bound(sum[n]-sum[i])$的位置$x$,如果$sum[x]$与$sum[n]-sum[i]$相等,且$x$大于$i$,更新答案
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=2e5+10; int n; long long sum[maxn],ans; int main() { scanf("%d",&n); for(int x,i=1;i<=n;i++) { scanf("%d",&x); sum[i]=sum[i-1]+x; } for(int i=1;i<=n;i++) if(sum[i]<=sum[n]/2) { int x=lower_bound(sum+1,sum+n+1,sum[n]-sum[i])-sum; if(x>=i&&sum[x]==sum[n]-sum[i]) ans=sum[i]; } printf("%lld\n",ans); return 0; }