博客
关于我
BZOJ 1106 [POI2007]立方体大作战tet
阅读量:270 次
发布时间:2019-03-01

本文共 1712 字,大约阅读时间需要 5 分钟。

题目链接

给定一个由0到9以及负数符号组成的数字序列,我们需要将相邻相同的数字合并为一个,并计算合并过程中每一次操作所需的最小总距离。每次操作可以选择合并相邻的两个相同数字,或者选择一个更长的连续相同数字进行合并。我们的目标是找到一种合并顺序,使得总距离最小。

思路

为了找到最优的合并顺序,我们可以采用贪心算法。具体来说,我们从左到右扫描序列,遇到两个或多个相同的数字时立即合并。为了高效地维护和查询数字的出现位置以及连续相同数字的块,我们可以使用树状数组(Fenwick Tree)来记录数字的位置信息。这样可以在每次合并时快速查询并更新相关的位置信息,从而确保算法的高效性。

例如,考虑以下两种情况:

1 2 2 1

在这个序列中,我们首先合并22,然后合并11。这样可以确保每次合并都尽可能地减少后续操作的总距离。

1 2 1 2

在这个序列中,无论先合并11还是22,总距离的结果都是一样的。因此,我们可以随便选择一种合并顺序。

通过这种贪心策略,我们可以在一次从左到右的扫描中找到所有可以合并的相同数字对,并用树状数组维护它们的出现位置,从而高效地计算出最小的总距离。

代码

#include 
#include
const int maxn = 100000;int read() { int x = 0, f = 1; char ch = getchar(); while ((ch < '0') || (ch > '9')) { if (ch == '-') { f = -f; } ch = getchar(); } while ((ch >= '0') && (ch <= '9')) { x = x * 10 + ch - '0'; ch = getchar(); } return x * f;}namespace tree_array { int c[maxn + 10]; inline int lowbit(int x) { return x & (-x); } inline int add(int pos, int x) { while (pos <= n) { c[pos] += x; pos += lowbit(pos); } return 0; } inline int sum(int pos) { int res = 0; while (pos > 0) { res += c[pos]; pos -= lowbit(pos); } return res; }}int main() { n = read(); for (register int i = 1; i <= n; ++i) { a = read(); if (!pre[a]) { pre[a] = i; tree_array::add(i, 1); } else { ans += tree_array::sum(i) - tree_array::sum(pre[a] - 1) - 1; tree_array::add(pre[a], -1); } } printf("%d\n", ans); return 0;}

上述代码实现了一个基于贪心算法的解决方案,使用树状数组来高效维护数字的位置信息。通过一次从左到右的扫描,我们可以在每一步找到所有可以合并的相同数字对,并更新相关的位置信息,从而计算出最小的总距离。

转载地址:http://aywo.baihongyu.com/

你可能感兴趣的文章
Pandas 对数据框的布尔比较
查看>>
pandas 将通话数据分割为15分钟的间隔
查看>>
pandas 找到局部最大值和最小值
查看>>
pandas 按日期和年份分组,并汇总金额
查看>>
pandas 数据帧到PostgreSQL表中使用的是没有SQLAlChemy的心理复制2吗?
查看>>
pandas 数据框将 INT64 列转换为布尔值
查看>>
pandas 数据框条件 .mean() 取决于特定列中的值
查看>>
pandas 数据框至海运分组条形图
查看>>
pandas 时间序列重新采样结束给定的一天
查看>>
pandas 根据不是常量的第三列的值将值从一列复制到另一列
查看>>
pandas 根据值从多列中的一列查找
查看>>
Pandas 根据布尔条件选择行和列
查看>>
pandas 滚动窗口 - datetime64[ns] 未实现
查看>>
pandas 版本兼容特定的蟒蛇和NumPy配置吗?
查看>>
pandas 生成excel多级表头
查看>>
Pandas 的 DataFrame 详解-ChatGPT4o作答
查看>>
pandas 读取excel数据,以字典形式输出
查看>>
Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
查看>>
pandas 适用,但仅适用于满足条件的行
查看>>
pandas 重新采样到每月的特定工作日
查看>>