POJ2566-Bound Found

####题意
给定长为n的数组,以及k次询问,每次询问给出一个t,在数组中找一段连续的区间[l,r]使得 |∑ijai\sum_{i}^j a_i∑ij​ai​| - t 有最小值,在一行中输出 |∑ijai\sum_{i}^j a_i∑ij​ai​|,区间开始位置和结束位置,区间不为空。(一定要注意区间不为空)

####数据范围
1<=n<=100000
aia_iai​<=10000
0<=t<=1000000000
####输入
多组输入,第一行输入n,k,第二行输入n个数表示数组,接下来k行每行一个整数t
####输出
对于每个询问输出三个结果,最接近的区间和,区间起始位置,区间结束位置

####思路:
求区间和,首先求前缀和sum数组,区间∑ijai\sum_{i}^j a_i∑ij​ai​=sumjsum_jsumj​ - sumi−1sum_{i-1}sumi−1​,注意到这个题有一个绝对值,那么就有 |sumjsum_jsumj​ - sumisum_isumi​| == |sumisum_isumi​ - sumjsum_jsumj​|,可以证明加上绝对值之后,两个前缀和相减求区间的和与顺序无关。那么我们拍一遍序之后,就可以创造单调性,然后转化到求区间和与具体数值 t 的问题,尺取法可以用来解决这种问题。Special judge要注意区间不能为空。具体操作为:

if(sum<t) r++;
else l++;
if(l==r) r++;

####代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define LL long long
#define P pair<int,int>using namespace std;const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
P p[maxn];bool cmp(P a,P b)
{return a.first<b.first;
}int main()
{int n,k,x,t,sum;while(scanf("%d%d",&n,&k)&&n+k){sum=0;p[0]=make_pair(0,0);for(int i=1; i<=n; ++i){scanf("%d",&x);sum=sum+x;p[i]=make_pair(sum,i);}sort(p,p+n+1,cmp);while(k--){scanf("%d",&t);sum=0;int l=0,r=1,ansl,ansr,mi=INF,ans;while(r<=n&&mi){sum=p[r].first-p[l].first;if(abs(sum-t)<=mi){mi=abs(sum-t);ans=sum;ansl=p[l].second;ansr=p[r].second;}if(sum<t) r++;else l++;if(l==r) r++;}if(ansl>ansr) swap(ansl,ansr);printf("%d %d %d\n",ans,ansl+1,ansr);}}return 0;
}

POJ-Bound Found | 尺取法+绝对值特性相关推荐

  1. Bound Found POJ - 2566(尺取法+前缀和创造区间变化趋势)

    题意: 给定一个数组和一个值t,求一个子区间使得其和的绝对值与t的差值最小,如果存在多个,任意解都可行. 题目: Signals of most probably extra-terrestrial ...

  2. poj 3061(尺取法)

    从长为n的全为正数的数组a中,找到个数最少的连续子数列使其和>=m example: n=10,m=15,a[10]={5 1 3 5 10 7 4 9 2 8},结果为2 解题思路:昨天做了一 ...

  3. Bound Found POJ - 2566(尺取法)

    Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronaut ...

  4. poj 3061 Subsequence 尺取法

    题目描述 给定长度为n的数列整数a0,a1,a2-an-1以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0 解题思路: 取尺法: 取尺法通常是指对数组保存一对下标(起点和重点 ...

  5. 尺取法 POJ 3601 Subsequence

    题目传送门 1 /* 2 题意:求连续子序列的和不小于s的长度的最小值 3 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 4 1. 记录前i项的总和,求[i, p)长度的最小值,用二分 ...

  6. POJ 3320 尺取法,Hash,map标记

    1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...

  7. POJ 3061 (二分+前缀和or尺取法)

    题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...

  8. Bound Found POJ - 2566 (尺取+前缀和)

    题意 就是给一串序列 在给一个t 求一段区间的加和绝对值与t最小的值与区间左右端点是多少 思路 这道题一开始不知道如何去做 用尺取法求区间但是因为区间中存在负数没有单调性  没有特殊的特征 若对区间求 ...

  9. 尺取法 POJ 3320 Jessica's Reading Problem

    题目传送门 1 /* 2 尺取法:先求出不同知识点的总个数tot,然后以获得知识点的个数作为界限, 更新最小值 3 */ 4 #include <cstdio> 5 #include &l ...

  10. 解题报告 (十三) 尺取法

    文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...

最新文章

  1. 看到外卖平台这样改善数据库架构,DBA表示放心了
  2. 论文其实也没有那么难!
  3. 「机器人界的微软」创始人逝世,从iPhone到汽车都离不开他的创造
  4. F#探险之旅(四):面向对象编程(中)
  5. python PyQt5中文教程☞【第二节】PyQt5基本功能(创建窗口、应用程序图标、显示提示语、通过按钮关闭窗口、消息框(关闭窗口确认框)、窗口显示在屏幕中间【居中显示】)
  6. centos7python命令_详解Linux Centos7下安装Python的方法
  7. ASP.NET WebAPI String 传值问题
  8. 李焕英 照片动起来了?B站 up主用AI还原动态影像
  9. Android安全与逆向之Java虚拟机和Dalvik虚拟机的区别
  10. OpenShift DIY:使用Gradle构建Spring Boot / Undertow应用程序
  11. unityscrollview生成大量_superscrollviewforUGUI的一些使用心得
  12. 2020年深度学习调参技巧合集
  13. 2021 河南 高考成绩查询,2021河南高考成绩查询入口
  14. onenote复制出来是图片_OneNote入门篇
  15. express怎么读取html,Express 配置HTML页面访问的实现
  16. python实践项目(四)
  17. 手把手,从零开始搭建个人博客网站(附源码)
  18. 高通设备找不到连接QXDM的端口
  19. 一种解决常见的80/443端口被占用导致steamcommunity 302服务无法启动的方法
  20. 5gh掌上云计算认证不通过_2018年阿里云ACP云计算认证多少分通过,怎么报名,如何参加考试...

热门文章

  1. python docx 表格复制粘贴_python Word 表格转 Excel
  2. excel 隐藏和取消隐藏
  3. elementui分页插件使用总结
  4. 司空见惯 - 英雄扫雷鼠
  5. ios描述文件下载安装
  6. 小学英语动词原形固定搭配+番外篇
  7. 8080端口被占用如何杀掉进程
  8. linux pack文件镜像,使用buildpack-deps 构建自己的入容器镜像
  9. Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍
  10. 昔日的百度“太子”为何因经济问题走上穷途