6576: guruguru

时间限制: 1 Sec  内存限制: 128 MB
提交: 28  解决: 12
[提交] [状态] [讨论版] [命题人:admin]

题目描述

Snuke is buying a lamp. The light of the lamp can be adjusted to m levels of brightness, represented by integers from 1 through m, by the two buttons on the remote control.
The first button is a "forward" button. When this button is pressed, the brightness level is increased by 1, except when the brightness level is m, in which case the brightness level becomes 1.
The second button is a "favorite" button. When this button is pressed, the brightness level becomes the favorite brightness level x, which is set when the lamp is purchased.
Snuke is thinking of setting the favorite brightness level x so that he can efficiently adjust the brightness. He is planning to change the brightness n−1 times. In the i-th change, the brightness level is changed from ai to ai+1. The initial brightness level is a1. Find the number of times Snuke needs to press the buttons when x is set to minimize this number.

Constraints
2≤n,m≤105
1≤ai≤m
ai≠ai+1
n, m and ai are integers.

 

输入

Input is given from Standard Input in the following format:
n m
a1 a2 … an

输出

Print the minimum number of times Snuke needs to press the buttons.

样例输入

4 6
1 5 1 4

样例输出

5
题解:

设置一个数组p, p[i] := 如果x在i位置, 对于所有操作, 使用第二个按钮能够减少的操作次数(相对于只使用第一个按钮) 
l = a[i], r = a[i+1], 如果l>r, 令r = r+m, 这样就不用考虑上界的问题了 
那么对于每一对l, r, 如果r-l<=1, 那么无论x在什么位置, 第二个按钮都不能减少操作次数 
如果r-l>1, 那么 
x在l+2位置使用第二个按钮能够减少1次操作, 在l+3位置能减少2次… 在r位置能够减少r-(l+2)+1次操作 
所以p[l+2] += 1, p[l+3] += 2 ... p[r] += r-(l+2)+1 
对每一对l, r如此处理, 得到最后的p数组 
设all为只使用第一个按钮所需要的操作总次数 
那么`最少操作次数 = all - max{p[i]+p[i+m]}, 1<=i<=m

以上就是基本思路, 如果不加其他优化, 直接写的话, 复杂度O(mn)O(mn) 
能优化的地方是p[l+2] += 1, p[l+3] += 2 ... p[r] += r-(l+2)+1这就是复杂度里m的来源, 可以将它优化到O(1)O(1)

如果要将p[l]到p[r]依次加上1, 2, … r-l+1 
我们可以这样: p[i] += 1, p[r+1] -= r-l+1 + 1, p[r+2] += r-l+1, 每次只更新这三个值, 最后再从头到尾p[i] += p[i-1] 
具体的一组例子, 比如l=2, r=5

更新操作 复杂度 1 2 3 4 5 6 7
更新三个值 O(1)O(1) 0 1 0 0 0 -5 4
p[i]+=p[i-1] O(n)O(n) 0 1 1 1 1 -4 0
p[i]+=p[i-1] O(n)O(n) 0 1 2 3 4 0 0

所以最后总复杂度O(n+m)

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+50;
typedef long long ll;
ll n,m,a[MAXN],p[MAXN];
int main()
{
    ll sum = 0;
    scanf("%lld %lld",&n,&m);
    for(int i=0; i<n; ++i)
    {
        scanf("%lld",&a[i]);
    }
    for(int i=1; i<n; ++i)
    {
        ll l=a[i-1],r=a[i];
        if(l>r)
        {
            r+=m;
        }
        sum+=r-l;
        if(r-l>1)
        {
            p[l+2]+=1;
            p[r+1]-=(r-(l+2)+1)+1;
            p[r+2]+=(r-(l+2)+1);
        }
    }
    for(int i=1; i<=2*m; ++i)
    {
        p[i] += p[i-1];
    }
    for(int i=1; i<=2*m; ++i)
    {
        p[i]+=p[i-1];
    }
    ll ans=-1;
    for(int i=1;i<=m;i++)
    {
        ans=max(ans,p[i]+p[i+m]);
    }
    printf("%lld\n",(sum-ans));
    return 0;
}

最新文章

  1. LeetCode刷题系列
  2. 网站整站下载工具—HTTrack Website Copier
  3. 查找n个数字中的最大值
  4. 20145212 《Java程序设计》第3周学习总结
  5. Simple colum formatting in Yii 2 GridView
  6. adb error: device not found
  7. Solr4.3之检索建议suggest
  8. 超链接点击后不显示hover
  9. Microsoft TFS 如何显示在Windows 的上下文菜单中
  10. android代码设置、打开WLAN wifi热点及热点的连接
  11. GridView - javascript 触发后台 OnSelectedIndexChanged
  12. 《算法实战策略》-chaper19-队列、栈和双端队列
  13. java基本打印练习《我行我素购物系统》
  14. Lammp安装过程
  15. OpenCV探索之路(十三):详解掩膜mask
  16. 微信H5支付:网络环境未能通过安全验证,请稍后再试。解决办法(PHP版)
  17. 为什么java局部变量没有初始化就会报错,而成员变量没有初始化就不会报错?
  18. [深度学习工具]&#183;极简安装Dlib人脸识别库
  19. iOS ----------关于动画
  20. Delphi10.2 Tokyo试用(1)

热门文章

  1. WPF之触发器
  2. js函数—隐形参数this
  3. 笔记-JavaWeb学习之旅18
  4. windows installer cleanup utility - Windows下卸载神器
  5. maven settings.xml linux
  6. JS中比较的数值如何比较大小
  7. 微服务实践分享(2)api网关
  8. 用于&lt;挣值管理&gt;的各种指标计算
  9. java初探之初始化
  10. DetachedCriteria的简单使用