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;
}

guruguru的更多相关文章

  1. AtCoder Regular Contest 077 E - guruguru

    https://arc077.contest.atcoder.jp/tasks/arc077_c 有m个点围成一个圈,按顺时针编号为1到m,一开始可以固定一个位置x,每次操作可以往顺时针方向走一步或直 ...

  2. Arc077_E Guruguru

    传送门 题目大意 有$m$个点编号从小到大按照顺时针编成了一个环,有一枚棋子,每次移动可以选择顺时针移动到下一个或者直接移动到编号为$x$的点,现在有$n-1$次数操作,第$i$次要把棋子从第$A_i ...

  3. AtCoder Regular Contest 077 E - guruguru 线性函数 前缀和

    题目链接 题意 灯有\(m\)个亮度等级,\(1,2,...,m\),有两种按钮: 每次将亮度等级\(+1\),如\(1\rightarrow 2,2\rightarrow 3,...,m-1\rig ...

  4. atcode E - guruguru(思维+前缀)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...

  5. AT2650 [ARC077C] guruguru

    可以发现,如果我们枚举每个理想亮度 \(X\) 然后再求在这个理想亮度情况下的答案是非常难维护的. 不妨反过来,考虑每个位置 \(i, i + 1\) 之间对每个理想亮度 \(X\) 减少次数的贡献. ...

  6. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

  7. protocol(协议) 和 delegate(委托)也叫(代理)---辨析

    protocol和delegate完全不是一回事. 协议(protocol),(名词)要求.就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. 委托(delegate),(动 ...

  8. AtCoder Regular Contest 077

    跟身在国外的Marathon-fan一起打的比赛,虽然最后没出F但还是涨分了. C - pushpush 题意:n次操作,每次往一个序列后面塞数,然后把整个序列翻转. #include<cstd ...

  9. 【AtCoder】ARC077

    C - pushpush 如果是按下标说的话 如果是偶数个 那么是 \(N,N - 2,N - 4...1,3,5...N - 1\) 如果是奇数个 \(N,N - 2,N - 4...2,4,6.. ...

随机推荐

  1. Linux 程式減肥(strip & objcopy)(转载)

    转自:http://calamaryshop.blogspot.com/2011/11/linux-strip-objcopy.html 對於設計嵌入式Linux系統的研發人員來說,記憶體的空間是非常 ...

  2. HTML5学习笔记(一)相关概率

    HTML5的设计目的是为了在移动设备上支持多媒体. 声明:<!DOCTYPE html> 注意:对于中文网页需要使用 <meta charset="utf-8"& ...

  3. [Xcode 实际操作]六、媒体与动画-(14)使用SystemSoundId播放简短声音

    目录:[Swift]Xcode实际操作 本文将演示如何播放音频素材. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文 ...

  4. 《Python数据科学手册》第五章机器学习的笔记

    目录 <Python数据科学手册>第五章机器学习的笔记 0. 写在前面 1. 判定系数 2. 朴素贝叶斯 3. 自举重采样方法 4. 白化 5. 机器学习章节总结 <Python数据 ...

  5. vue教程5-账户登录

    router export const constantRouterMap = [ { path: '/login', component: () => import('@/views/logi ...

  6. HttpServletRequest 和 HttpServletResponse

    Servlet配置方式 全路径匹配 以 / 开始 /a /aa/bb localhost:8080/项目名称/aa/bb 路径匹配 , 前半段匹配 以 / 开始 , 但是以 * 结束 /a/* /* ...

  7. net core WebApi 使用Swagger

    Asp.net core WebApi 使用Swagger生成帮助页 最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core ...

  8. linux打包文件,压缩文件

    1.打包: linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进行压缩. 1.命令格 ...

  9. Zookeeper+websocket实现对分布式服务器的实时监控(附源码下载)

    ​ 我就是个封面 Zookeeper简介 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统. 简单来说就是一个Zookeeper注册同步中心,内部结构为一个树形目录,每个节点上 ...

  10. Tensorflow版Faster RCNN源码解析(TFFRCNN) (3)推断(测试)过程使用RPN时代码运行流程

    本blog为github上CharlesShang/TFFRCNN版源码解析系列代码笔记第三篇   推断(测试)过程不使用RPN时代码运行流程 作者:Jiang Wu  原文见:https://hom ...