这个题有点无奈,用尺取法不难想到,但是这个题对于初始化值卡的比较大,我初始化值赋为1<<29无限WA,改为1<<30AC
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<climits>
using namespace std;
const int inf=1<<30;
const int maxn=1e5+1000;
int n,k,sum;
pair<int,int> g[maxn];
int main()
{
while(scanf("%d%d",&n,&k)&&(n+k))
{
sum=0;
g[0]=make_pair(0,0);
for(int i=1;i<=n;i++)
{
int val;
scanf("%d",&val);
sum+=val;
g[i]=make_pair(sum,i);
}
sort(g,g+n+1);
while(k--)
{
int t;
scanf("%d",&t);
int pre=0,last=1,val=inf,ans,ansl=1,ansr=1;
while(last<=n&&val)
{
int num=g[last].first-g[pre].first;
if(abs(num-t)<val)
{
val=abs(num-t);
ans=num;
ansl=g[pre].second;
ansr=g[last].second;
}
if(num<t)
last++;
if(num>t)
pre++;
if(pre==last)
last++;
}
if(ansl>ansr)
swap(ansl,ansr);
printf("%d %d %d\n",ans,ansl+1,ansr);
}
}
return 0;
}