这道题不能直接对于数组进行尺取法,
尺取法需要单调性才能使用,所以我们维护前缀和,并且进行排序,就可以得到单调的序列了。
注意初始化的时候,pair(0,0)也要sort,才能使得解是全的。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const long long INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int, int> pir;
int n, k,t;
int a[100005];
pir p[100005];
void solve()
{
int ans = 0, dis = INT_MAX;
int pos = 1, s = 0;
int s1, s2;
int lf, rt;
while (pos <= n && s <= n)
{
if (pos == s) { pos++; continue; }//相等的时候要加一
s1 = p[s].first;
s2 = p[pos].first;
// cout << s2 << endl;
if (abs(abs(s1 - s2) - t) < dis)
{
dis = abs(abs(s1 - s2) - t);
ans = abs(s1 - s2);
/*cout << "s1" << s1 << "s2" << s2 << endl;
cout << s << " " << pos << endl;
cout << "aans" << ans << endl;*/
lf = p[s].second;
rt = p[pos].second;
}
if (abs(s1 - s2) < t)pos++;
else s++;
}
if (lf > rt)swap(lf, rt);
printf("%d %d %d%c", ans,lf+1, rt, '\n');//这里取得端点 左端点要加一
return;
}
int main()
{
while (cin >> n >> k )
{
if (!n && !k) break;
memset(a, 0, sizeof(a));
int sum = 0;
upd(i, 1, n)
{
cin >> a[i];
sum += a[i];
p[i] = pir(sum, i);
}
p[0] = pir(0, 0);
sort(p, p + n + 1);//从零开始sort
up(i, 0, k)
{
cin >> t;
solve();
}
}
return 0;
}