序列(bzoj1108)

序列

有一个非递减的整数序列 S 1 , S 2 , S 3 , … , S n + 1 ( S i ≤ S i + 1 ) S_1,S_2,S_3,\dots,S_{n+1}(S_i \leq S_{i+1}) S1S2S3Sn+1SiSi+1。定义序列 m 1 , m 2 , … , m n ¬ m_1,m_2,\dots,m_n \lnot m1m2mn¬ S S S M M M 序列,其中 m i = ( S i + S i + 1 ) / 2 m_i=(S_i+S_i+1)/2 mi=(Si+Si+1)/2
例如, S = ( 1 , 3 , 3 , 5 ) S=(1, 3, 3, 5) S=(1,3,3,5),则 m = ( 2 , 3 , 4 ) m=(2, 3, 4) m=(2,3,4)
现在给你序列 m m m,要你求有多少个 S S S 序列的 M M M 序列是序列 m m m


我觉得吧,其实这一道题目个数论的关系并不大,我使用贪心加乱搞写出来了。后来问了一下大佬,知道了其实贪心暴力按照对称轴对折这种找区间大小这么做,其实跟求不等式挂钩的。什么关系呢?也就是说因为只要 S 1 S_1 S1 能够确定下来,其他的数也就都可以确定了,然后我们分类讨论:

  • i i i 为奇数时: S i S_i Si 可以表示成 ( M 1 − M 2 + M 3 − . . . + M i − 1 ) × 2 − S 1 (M_1-M_2+M_3-...+M_{i-1})\times 2 - S_1 (M1M2+M3...+Mi1)×2S1
  • i i i 为偶数是: S i S_i Si 可以表示成 S i = ( − M 1 + M 2 − M 3 + . . . + M i − 1 ) + S 1 S_i=(-M_1+M_2-M_3+...+M_{i-1})+S_1 Si=(M1+M2M3+...+Mi1)+S1

那么我们就得到了 n n n 个一元一次不等式,直接求解就可以了。但是我个人认为还是贪心对折好理解一点。

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int a[5000005],n,l,r,L,R;
int main()
{
    cin>>n;
    l=r=0;
    L=-2100000000;
    R=-L;
    for (int i=1;i<=n;i++)
	{
        cin>>a[i];
        if (i%2)
		{
            r=l+a[i]-a[i-1];
            R=min(R,r);
        }
        else
		{
            l=r+a[i-1]-a[i];
            L=max(L,l);
        }
    }
    printf("%d\n",max(0,R-L+1));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值