排序每一种可能的区间前缀和,然后查询每个点相邻的40(4也行)种情况,直接AC
有没有HACK数据捏
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1010;
struct node{
int l, r,sum;
bool operator<(const node &T){
return sum<T.sum;
}
};
int s[N];
signed main() {
int n;
cin >> n;
vector<node>v;
for (int i = 1,a; i <= n; i++) {
cin>>a;
s[i] = s[i - 1] + a;
}
int cnt = 0;
for (int i = 1; i<=n; i++) {
for (int j =i;j<=n; ++j) {
node temp;
temp.l=i;
temp.r=j;
temp.sum=s[j]-s[i-1];
v.push_back(temp);
}
}
sort(v.begin(),v.end());
int res=0x3f3f3f3f3f3f3f3f;
for(int i=0;i<v.size();i++){
for(int j=i+1;j-i<40&&j<v.size();j++){
int l1=v[i].l,r1=v[i].r,l2=v[j].l,r2=v[j].r;
int ans=abs(v[i].sum-v[j].sum);
if(r1<l2||l1>r2){
res=min(res,ans);
}
}
}
cout<<res<<"\n";
return 0;
}