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 |
思考过程如下
在比大小过程中,卡住了。
//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;
}