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

题目链接:http://poj.org/problem?id=2566

题意:给定一个序列(n个整数)和一个整数k(m个),求出这个序列的一个子串,使之和的绝对值与k的差最小。

尺取法的题目有两个特性:

1. 所求的序列是一个连续的序列,这样才能将序列抽象成一个头和一个尾来描述。

2. 头尾枚举的序列满足某种单调的性质,这样才能进行尺取的操作。

这个序列是一个随意的序列,不可能直接对其进行操作,先要预处理下,进行前缀和操作,把对应的值和标记放在同一个pair。

然后根据前缀和的值进行排序,这样就符合尺取法的两个特性了。

其他的就是一些细节上的东西了。直接上代码,(•‾??‾?•)??°,

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int INF=0x3f3f3f3f;
 6 const int N=100011;
 7 pair <int,int> T[N];
 8
 9 //前缀和初始化
10 void init(int n){
11     T[0]=make_pair(0,0);//这里需要放一个0,0进去,不然有一些值就取不到了.
12     int x,tmp=0;
13     for(int i=1;i<=n;i++){
14         scanf("%d",&x);
15         tmp+=x;
16         T[i]=make_pair(tmp,i);
17     }
18     sort(T,T+n+1);
19 }
20
21 int main(){
22     int n,m;
23     while(scanf("%d %d",&n,&m)){
24         if(n==0&&m==0) break;
25         init(n);
26         for(int i=1;i<=m;i++){
27             int l=0,r=1,t=INF;
28             int tmp,ansl,ansr,ans;
29             scanf("%d",&tmp);
30             while(r<=n&&t){
31                 int temp=T[r].first-T[l].first;
32                 if(abs(temp-tmp)<t){
33                     t=abs(temp-tmp);
34                     ans=temp;
35                     ansl=T[l].second;
36                     ansr=T[r].second;
37                 }
38                 if(temp<tmp) r++;
39                 if(temp>tmp) l++;
40                 if(temp==tmp) break;
41                 if(l==r) r++; //保证r>=l
42             }
43             if(ansl>ansr) swap(ansl,ansr);//因为是经过排序过的,有可能左边的比右边的大.
44             printf("%d %d %d\n",ans,ansl+1,ansr);//左边多加了一个0,需要+1
45         }
46     }
47     return 0;
48 }
时间: 2024-11-05 19:49:58

POJ - 2566 Bound Found(尺取法+前缀和)的相关文章

poj 2566 Bound Found 尺取法 变形

Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2277   Accepted: 703   Special Judge Description Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronautic and Space Administration

poj 2566 Bound Found (前缀和,尺取法(two pointer))

Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2010   Accepted: 659   Special Judge Description Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronautic and Space Administration

poj 2566 Bound Found(尺取法 好题)

Description Signals of most probably extra-terrestrial origin have been received and digitalized by The Aeronautic and Space Administration (that must be going through a defiant phase: "But I want to use feet, not meters!"). Each signal seems to

POJ 3061 Subsequence ( 二分 || 尺取法 )

题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用先构造前缀和的方式来进行接下来的操作 ( 任意子序列的和都能由某两个前缀和的差表示 ). 二分做法 ==> 我们枚举起点,对于每一个起点 St 二分查找看看 St 后面有没有前缀和是大于或者等于 [ St的前缀和 ] + S 的,如果有说明从当前起点开始有一个终点使得起终之和是大于或者等于 S 的,

poj 3320 复习一下尺取法

尺取法(two point)的思想不难,简单来说就是以下三步: 1.对r point在满足题意的情况下不断向右延伸 2.对l point前移一步 3.  回到1 two point 对连续区间的问题求解有其独到之处 复杂度为0(n) 很实用的 #include<iostream> #include<map> #include<set> #include<vector> #include<cstdio> #define inf 1000002 us

POJ 3061 Subsequence(尺取法)

传送门 Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11284 Accepted: 4694 Description A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) ar

POJ - 2566 Bound Found

题意:询问一个静态序列的连续区间和绝对值最接近t的下标. 分析:由于询问的是绝对值,可以用前缀和相减得到区间和,并且和位置前后没有关系.于是把记录下标信息以后把 前缀和排序枚举大的前缀pj,pj-pi ≍ t,满足条件的:有pj-t的plower_bound以及plower_bound-1. 而pj-t也是单调的,再用一个下标i去维护就好. /********************************************************* * -----------------

poj 2566Bound Found(前缀和,尺取法)

http://poj.org/problem?id=2566: 题意:找连续的串,求和绝对值与所给数字最接近的串. 思路:先求下标为1的到其他下的串的值,也就是前缀和:这样可以在O(1)的时间内求出各个串的和.比如S1(1,1),S3(1,3); 那么S3-S1就是S(2,3): 然后对上面所求的前缀和按从小到大排序.(因为取的是绝对值所以abs(Sn-Sk)==abs(Sk-Sn)); 这样就可以用尺取法去做了.复杂度为O(n); 还可以用二分取找值,复杂度为O(n*log(n)); 1 #i

POJ 2566(尺取法

自己看了半天并没有看出这题怎么用尺取法(虽然一看就觉得肯定是尺取法..),由于是绝对值,那么在计算的时候头和尾的实际位置并不重要,而应用尺取法这个数列肯定得是单调,那么我们把前缀和处理出来排序就可以直接应用尺取法了 #include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<utility> #include<vector> #inc