bzoj 1811: [Ioi2005]mea 贪心,乱搞
[Ioi2005]mea
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 690 Solved: 257
[Submit][Status][Discuss]
Description
考虑一个非递减的整数序列 S1,....Sn+1(Si<=Si+1 1<=i<=n)。 序列M1...Mn是定义在序列S的基础上,关系式为 Mi=( Si + S(i+1) )/2, 1<=i<=n, 序列M叫做序列S的平均数序列。例如序列1,2,2,4的平均数序列为 1.5,2,3.注意到平均数序列中的元素可能为小数。但是本题的任务只是处理平均数序列都为整数的情况。 给出一个n个数字的非递减的整数序列M1,M2...Mn.请你计算出:序列S,S1...S(n+1)的平均序列是M1,...,Mn。 求满足以上条件的序列S的总个数。 任务: * 从标准输入文件中读入一个非递减的整数序列。 * 计算出平均序列是给出序列的整数序列的总个数。 * 把计算结果写到标准输出文件中。
Input
输入文件的第一行包含一个整数n(2<=n<=5 000 000).接下来的n行包含了这个给出的整数序列M1,..,Mn. 第i+1行包含一个整数Mi(1<=mi<=1000000000).对于本题,50%的测试数据中n<=1000,0<=Mi<=20000.
Output
输出文件仅一行,即所求答案。
Sample Input
3
2
5
9
2
5
9
Sample Output
4
HINT
本题一共存在4种序列, 他们的平均数序列都是2,3,9。这四种序列如下:
* 2,2,8,10
* 1,3,7,11
* 0,4,6,12
*-1,5,5,13
Source
题解:这道题目可以用两个指针来卡
比如说这个图,可以用两个指针来卡,最小的波动范围即为答案。
1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<queue> 7 8 #define N 5000007 9 using namespace std; 10 inline int read() 11 { 12 int x=0,f=1;char ch=getchar(); 13 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 14 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 15 return x*f; 16 } 17 18 int n,l,r,L,R; 19 int a[N]; 20 21 int main() 22 { 23 n=read(),L=l=a[1]=read(),R=r=a[2]=read(); 24 for (int i=3;i<=n;i++) 25 { 26 a[i]=read(); 27 int k=a[i]-a[i-1]; 28 if (i&1) 29 { 30 L=R-k; 31 l=max(l,L); 32 } 33 else 34 { 35 R=L+k; 36 r=min(r,R); 37 } 38 } 39 if (r-l<0) puts("0"); 40 else printf("%d\n",r-l+1); 41 }