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刷题记录

Accepted 59416 kb 4900 ms C++/Edit 732 B

思考过程如下

bzoj 1811 //1811: [Ioi2005]mea_第1张图片

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

//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 
#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=mx)printf("%lld\n",mn-mx+1);
	else printf("0\n");
	return 0;
}

 

你可能感兴趣的:(跟着大佬学算法)