【BZOJ1811】【IOI2005】mea 平均数

#include <stdio.h>
int main()
{
	puts("转载请注明出处谢谢");
	puts("http://blog.csdn.net/vmurder/article/details/42970501");
}

题意:自己去看

题解:

我们把平均数序列看成一个线段,那么这个线段就被序列中的数分成了若干段。

然后在其中一段上选一个点,原序列应该是唯一的,

【对应点:当前点+对应点/2=平均数序列中两段交界点】

所以它到下一段的对应点就是唯一的,而此时我们不妨把整个序列沿着当前段和下一段的交界点折一下,

这样当前选的这个点直接平移到折完后的那部分就是它的对应点了~

然后我们就可以把整个序列折来折去,最后它变成一段段的区间,取下交集。

代码中l、r是交集的左右边界,

L、R是当前区间。

注意无解的情况。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5001000
#define inf 0x3f3f3f3f
using namespace std;
int n,l,r;
int s[N];
int main()
{
//	freopen("test.in","r",stdin);
	int i,j,k;
	scanf("%d%d%d",&n,&s[1],&s[2]);
	int L=l=s[1],R=r=s[2];
	for(i=3;i<=n;i++)
	{
		scanf("%d",&s[i]);
		k=s[i]-s[i-1];
		if(i&1)
		{
			L=R-k;
			l=max(l,L);
		}
		else
		{
			R=L+k;
			r=min(r,R);
		}
	}
	printf("%d\n",r-l+1>=0?(r-l+1):0);
	return 0;
}
时间: 2024-11-08 21:10:49

【BZOJ1811】【IOI2005】mea 平均数的相关文章

[bzoj1811] [Ioi2005]mea

还是比较好想到的..设第一个数为x,那么以后的所有数都能用x和M表示出来. 然后再根据非递减的限制条件得出x的取值范围. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define ll long long 5 using namespace std; 6 const int maxn=5002333; 7 int i,j,k,n,m; 8 9 int ra;char rx; 10 inli

【BZOJ1811】[Ioi2005]mea 乱搞

[BZOJ1811][Ioi2005]mea 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

BZOJ 1811 IOI2005 mea

题目大意:有一个单调不降整数序列,定义平均值数列为这个数列的相邻两项的平均值组成的序列,现在给定这个平均值序列,问原序列有多少种 这相当于给定了相邻两项之间的对称轴 那么我将这个数轴沿着这个对称轴折叠 相邻两项在数轴上就重合了 如果将整个数轴沿着所有的对称轴各折叠一次,所有的点就会重合于一点 此时所有对称轴组成的区间的交集大小就是解的数量 注意无解情况 500W的读入还真有人敢传... #include <cstdio> #include <cstring> #include &l

bzoj1811 mea

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.

C/C++算法竞赛入门经典Page15 习题1-1 平均数

题目:输入3个整数,输出他们的平均值,保留3位小数. 首先,声明三个整数a,b,c和一个浮点数d: int a,b,c; double d; 输入三个整数a,b,c: scanf("%d%d%d",&a,&b,&c); 将a,b,c取平均值以后复制给d: d=(double)(a+b+c)/3; 最后输出d: printf("%.3lf",d); %.3lf表示保留3位小数的long float. 注意:不能直接这样输出: printf(&q

codevs 1389 乘积平均数

1389 乘积平均数 题目描述 Description 定义 n 个数的乘积平均数为这 n 个数的乘积开 n 次方.给定 n 个正整数,求它们的乘积平均数. 给定n 个正整数,求它们的乘积平均数. 输入描述 Input Description 第一行,一个数 n接下来一行 n 个数,表示给定的 n 个数 输出描述 Output Description 一个实数,表示给定数的乘积平均数,保留2 位小数输出 样例输入 Sample Input 22 8 样例输出 Sample Output 4.00

51nod 平均数(马拉松14)

平均数 alpq654321 (命题人) 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了方便起见,你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了. Input 第一行两个数n,k(1<=n<=100000,1<=k<=n*(n+1)/2). 接下来一行n个数表示LYK的区间(1<=ai<=100000). Outp

求多个四元数的平均数

最近要对前几帧数据进行平均数采样.所以又造了一个轮子 此方法经过一些单数和双数的基本测试,除了无效四元数这种特殊情况. Quaternion Average(Quaternion[] quatArray) { var result = new Quaternion(); var count = quatArray.Length; var error = 0; while (count > 1) { if (error >= 10000) break; error++; var k = 0; f

51nod 平均数(二分+树状数组)

题目链接: 平均数 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了方便起见,你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了. Input 第一行两个数n,k(1<=n<=100000,1<=k<=n*(n+1)/2). 接下来一行n个数表示LYK的区间(1<=ai<=100000). Output 一行表示第k大的