bzoj 1811 //1811: [Ioi2005]mea

bzoj 1811  //1811: [Ioi2005]mea   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1811

更多题解,详见https://blog.csdn.net/mrcrack/article/details/90228694BZOJ刷题记录

Accepted59416 kb4900 msC++/Edit732 B

思考过程如下

在比大小过程中,卡住了。

//1811: [Ioi2005]mea
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1811
//通过HINT看懂题意。
//利用条件,简单推导了S与M的关系
/*
分析:
sequence序列:
    令S序列的第一项为k,那么后面几项就可以写成关于k的多项式:
S1=k
S2=2*m1-k
S3=2*m2-2*m1+k „„
然后根据S序列的非递减性质,有S1<=S2<=S3<=….
所以有
    k<=2*m1-k
    2*m1-k<=2*m2-2*m1+k     
„„
可以得到n个关于k的不等式,而且都是有规律的,可以在O(n)的时间内解出形如 a<=k<=b 的结果。
由于k的值和S序列是一一对应的,所以k的取值的个数(b-a)就是满足要求的S序列的个数。
这个题解一开始看起来有点费劲,什么有规律的,我怎么没发现。
写前面的一些项,帮助发现规律吧。

S1+S2 = m1
S2 + S3 = m2
S3 + S4 = m3
s4 + s5 = m4
令S1 = k,则
S1 = k
S2 = 2*m1 - k;
S3 = 2*m2 - 2*m1 + k
S4 = 2*m3 - 2*m2 + 2*m1 - k
S5 = 2*m4 - 2*m3 + 2*m2 - 2*m1 + k

根据S1 <= S2 <= S3 <= S4 <= S5,则有
S1 <= S2           ---->       k < 2*m1 - k       ---->       k < m1
S2 <= S3           ---->       2*m1 - k < 2*m2 - 2*m1 + k       ---->     k > 2*m1 - m2
S3 <= S4           ---->       k < m3 - 2*m2 + 2*m1
S4 <= S5           ---->       k > 2*m3 - 2*m2 + 2*m1 - m4
可以发现<和>是交替的
那么就可以根据整理出的不等式,求出k的上下界。
*/
//写错了范围,边界本应是n+1,写成了n,查了半小时。2019-12-2 20:57
//样例通过,提交AC。2019-12-2 20:57

#include <stdio.h>
#define maxn 5000100
#define LL long long
int m[maxn];//注意该题,可用空间只有64M,若此处再用long long要爆空间。
LL b[maxn];
LL mx=-1LL<<62,mn=1LL<<62;
LL max(LL a,LL b){
	return a>b?a:b;
}
LL min(LL a,LL b){
	return a<b?a:b;
}
int main(){
	int n,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&m[i]);
	b[1]=0;
	for(i=2;i<=n+1;i++)b[i]=2*(LL)m[i-1]-b[i-1];//此处错写成for(i=2;i<=n;i++)b[i]=2*m[i-1]-b[i-1];
	for(i=2;i<=n+1;i++)//此处错写成for(i=2;i<=n;i++)
		if(i%2)mx=max(mx,(b[i-1]-b[i])/2);
		else mn=min(mn,(b[i]-b[i-1])/2);
	if(mn>=mx)printf("%lld\n",mn-mx+1);
	else printf("0\n");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值