2 条题解

  • 2
    @ 2022-10-15 21:25:55

    这题虽然题目写的是二分,但是实际正解和二分没啥关系,是前缀和的预处理问题,想明白开关灯的状态就行了。

    画图理解如下:

    tu1

    tu2

    操作是n段内每一段都加入操作判断一下。

    核心代码:

    //  s1 奇数前缀和, s2偶数前缀和(奇数代表d区间,偶数代表L区间)
    for(int i =1; i <= n ; i++) cin>>a[i];
            a[++n] = m;     //把m看成是一个时刻,把它放到a[n+1]里
            s1[n]  = s2[n] = 0;
            for(int i = n-1 ; i >= 0 ; i--)
            {
                s1[i] = s1[i+1];
                s2[i] = s2[i+1];
                if(i % 2 == 0 ) s1[i] += a[i + 1] - a[i];
                else s2[i] += a[i + 1] - a[i];
            }
            int ans = s1[0];     //一次都不按的灯亮时间总长度,注意此处维护的是后缀和 所以下标是0
            for(int i = 0 ; i < n ; i++)    // 从前往后枚举每个区间怎么按
            {
                int t = a[i + 1] - a[i];    // 求一下当前区间的长度
                if( t == 1) continue;       //如果当前区间亮灯长度 已经是1了
                ans = max(ans, s1[0] - s1[i]  + s2[i+1] + t -1);    // s1[0] - s1[i] 是前面的奇数区间
    ​
            }
    

    信息

    ID
    816
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    64
    已通过
    10
    上传者