NKOJ 3545 接近(DP+单调队列)

来源:互联网 发布:2017淘宝开店营业执照 编辑:程序博客网 时间:2024/05/18 02:31

P3545接近

问题描述

对于一个数字序列A,并且有若干询问。对于每个询问,要求求出一段在序列A中非空 的连续段使得这一段数字的总和的绝对值尽量接近P。

输入格式

第一行2个数N、T,表示序列的长度和询问的个数。
接下来一行N个整数,表示A序列。 接下来T行,每行一个数P表示询问。

输出格式

共输出T行,每行对应一个询问的答案。
输出3个数:第一个数为能够实现的最接近P 的数,后面两个数L、R表示A序列中的L到 R这一段数能实现这个答案。
如果存在多解,输出L最小的解;
如果还有多解,输出R最小的解。

样例输入

5 1
-10 -5 0 5 10
3

样例输出

5 2 2

数据范围

30%的数据 1<=N<=1,000。
60%的数据 1<=N<=10,000。
100%的数据 1<=N<=100,000,A 序列中数字绝对值<=10,000,T<=100,询问的 数字<=10^9


此题容易想到求出前缀和数组Sum,鉴于复杂度,需要一个O(n)的算法,但此时遇到的问题就是,前缀和数组并不具有单调性。
注意到题目中的绝对值,于是学习到了一个大胆的操作,将前缀和数组排序,强行维护单调性,而且位置坐标并不会对答案产生影响,于是就单调DP即可。


代码:

#include<stdio.h>#include<iostream>#include<algorithm>#define ll long longusing namespace std;struct node{ll v,c;};bool cmp(node a,node b){    if(a.v==b.v)return a.c>b.c;    return a.v<b.v;}node S[123456];ll n,T,x,L,ans,tmp,l,r;void MD(int p,int q){    int tx,ty,t;    tx=S[p].c;ty=S[q].c;    if(tx>ty)swap(tx,ty);    t=S[p].v-S[q].v-x;    if(t<0)t=-t;    if(t<tmp)tmp=t,ans=S[p].v-S[q].v,l=tx,r=ty;    if(t==tmp&&tx<l)l=tx,r=ty,ans=S[p].v-S[q].v;    if(t==tmp&&tx==l&&ty<r)r=ty,ans=S[p].v-S[q].v;}void Work(){    L=0;tmp=1e18;    for(int i=1;i<=n;i++)    {        while(L<i-1&&S[i].v-S[L+1].v>=x)L++;        MD(i,L);if(L<i-1)MD(i,L+1);//更新答案    }    printf("%lld %lld %lld\n",ans,l+1,r);}int main(){    scanf("%lld%lld",&n,&T);    for(int i=1;i<=n;i++)scanf("%lld",&x),S[i].v=S[i-1].v+x,S[i].c=i;    sort(S,S+n+1,cmp);    while(T--)scanf("%lld",&x),Work();}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子好动注意力不集中怎么办 学生在课堂上爱讲话怎么办? 幼儿园老师圢小孩脸怎么办 宝宝上幼儿园坐不住怎么办 宝宝在幼儿园总是坐不住怎么办 早教课上宝宝坐不住怎么办? 孩子在幼儿园上课坐不住怎么办 小孩不会写拼音a怎么办 小朋友上课注意力不集中怎么办 一年级孩子上课爱说话怎么办 一年级小孩不听老师话怎么办 大班幼儿规则意识差怎么办 幼儿大班《打雷了怎么办》的教案 小孩上课不听讲到处乱跑怎么办 小孩子经常咬人好动怎么办 6个月宝宝好动怎么办 新生调皮被幼儿园退学怎么办 孩子在幼儿园太调皮怎么办 幼儿上课注意力不集中怎么办 幼儿上课一半要离开怎么办 八个月宝宝消化不良拉肚子怎么办 8个月的宝宝拉肚子怎么办 孕8个月拉稀怎么办 孩子调皮好动爱说话怎么办 宝宝8个月不会爬怎么办 怀孕8个月不想要了怎么办 8个月宝宝发烧怎么办 八个月的小孩发烧怎么办 孩子8个月发烧38怎么办 8个宝宝发烧38度怎么办 怀孕八个月不想要怎么办 怀孕八个月不想要了怎么办 八个月宝宝拉肚子拉水怎么办 八个月的宝宝拉肚子怎么办 八个月发烧38度怎么办 孩子特别调皮好动该怎么办 孩子有好动症该怎么办 在幼儿园好动的孩子该怎么办 18个月宝宝上火怎么办 打孩子越打上瘾怎么办 八个月不想要了怎么办