bzoj 1811: [Ioi2005]mea 乱搞

题意:

求有多少个不下降的整数队列,他们相邻的值等于题目要求的值。

题解:

不难发现,只要第一个数确定,后面的数都能知道了。
所以是确定第一个数的范围。
设是x,将序列M都*2,后面依次是 M1x,M2M1+x,M3M2+M1x
所以将新的常数计算出来,解n个不等式就行了。
要long long,inf要够大。
code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
LL a[5000010],n;
const LL inf=(1LL<<60);
LL calc(LL x)
{
    if(x%2==0) return x/2;
    if(x>0) return (x+1)/2;
    if(x<0) return (x-1)/2;
}
int main()
{
    scanf("%lld",&n);
    for(LL i=1;i<=n;i++)
    {
        LL M;scanf("%lld",&M);
        M*=2;
        a[i+1]=M-a[i];
    }
    LL l=-inf,r=inf;
    for(LL i=1;i<=n;i++)
    {
        if(i&1)
            r=min(r,(a[i+1]-a[i])/2);
        else
            l=max(l,calc(a[i]-a[i+1]));
    }
    if(l>r) printf("0");
    else printf("%lld",r-l+1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值