#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) ((x)<<1)
#define r(x) ((x)<<1|1)
#define lowbit(x) ((x)&-(x))
#define abs(x) ((x)>=0?(x):-(x))
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node {
ll val, index;
node(ll v,ll i):val(v),index(i){}
node():val(0),index(0){}
friend bool operator<(const node &a, const node &b) {
return a.val < b.val;
}
};
int demo[1111111];
node sum[1111111];
int n, k, t, ans, as = 0, at = 1;
int main() {
while (scanf("%d%d", &n, &k), n != 0) {
sum[0] = node(0, 0);
for (int i = 1; i <= n; i++) {
scanf("%d", demo + i);
sum[i] = node(sum[i - 1].val + demo[i], i);
}
sort(sum, sum + n + 1);
for (int i = 0; i < k; i++) {
scanf("%d", &t);
int beg = 0, end = 1,tmp = INF,b;
while (end<=n) {
b = sum[end].val - sum[beg].val;
if (abs(t - b) < tmp) {
tmp = abs(t - b);
ans = b;
as = min(sum[beg].index, sum[end].index);
at = max(sum[beg].index, sum[end].index);
}
if (b > t) beg++;
else if (b < t) end++;
else break;
if (beg == end) end++;
}
printf("%d %d %d\n", ans, as+1, at);
}
}
return 0;
}
poj 2566 尺取模板
最新推荐文章于 2020-07-10 21:58:21 发布