那个网站做推广比较好,网站注册费,池州海绵城市建设官方网站,上海企业信息登记号查询题意 就是给一串序列 在给一个t 求一段区间的加和绝对值与t最小的值与区间左右端点是多少 思路 这道题一开始不知道如何去做 用尺取法求区间但是因为区间中存在负数没有单调性 没有特殊的特征
若对区间求一下前缀和 就使整个区间有了单调性 由于绝对值情况下 没有前后 所以…题意 就是给一串序列 在给一个t 求一段区间的加和绝对值与t最小的值与区间左右端点是多少 思路 这道题一开始不知道如何去做 用尺取法求区间但是因为区间中存在负数没有单调性 没有特殊的特征
若对区间求一下前缀和 就使整个区间有了单调性 由于绝对值情况下 没有前后 所以我们队前缀和后的序列排序
对排序后的前缀和数串进行尺取 若是l和r内的数比t小r 比t大就l 若相等就break code #includeiostream
#includecstring
#includecstdio
#includealgorithm
using namespace std;
const int inf 100010;pairint,intsum[inf];
int main()
{int n,k;while(cinnk,nk){int tem0;sum[0]make_pair(0,0);for(int i1;in;i){int p;scanf(%d,p);temp;sum[i]make_pair(tem,i);}sort(sum,sumn1);
// for(int i0;in;i)
// coutsum[i].first sum[i].secondendl;while(k--){int t;scanf(%d,t);int al,ar,ami,l0,r1,MAX 2000000000;while(rnMAX){int ee sum[r].first-sum[l].first;if(abs(ee-t)MAX){MAX abs(ee-t);ami abs(ee);// coutami l r 123endl;al sum[l].second;ar sum[r].second;}if(eet)r;else if(eet)l;else break;if(lr)r;}printf(%d %d %d\n,ami,min(al,ar)1,max(al,ar));}}return 0;
}