ARC194C - Cost to Flip 题解

news/2025/3/12 8:50:12/文章来源:https://www.cnblogs.com/YipChipqwq/p/-/ARC194C

ARC194C

首先把所有的物品分类,可以得到四种不同的种类:

  • \(0 \to 0\),不用管
  • \(0 \to 1\),需要变为 \(1\)
  • \(1 \to 0\),需要变为 \(0\)
  • \(1 \to 1\),有两种情况:
    • 不改变
    • \(1 \to 0 \to 1\)

因此,考虑一个显然的贪心,从大到小先翻转需要 \(1 \to 0\) 的比特,再从小到大翻转需要 \(0 \to 1\) 的比特,但是 \(1 \to 1\) 怎么办呢?

我们发现我们可以贪心的从大到小逐渐插入 \(1 \to 0 \to 1\) 的部分,也就是说如果有一个 \(1 \to 1\) 需要被翻转两次,只需要把这个比特同时加入两个组 \(1 \to 0\)\(0 \to 1\) 内即可。

通过前缀和操作不难想到线性做法。

参考代码(可参照注释)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 2e5 + 10;
int n, n1, n2, n3;
struct Node {ll a, b, c;
}bit[N];ll zero_to_one[N], one_to_zero[N], is_one[N];
ll pre1[N], pre2[N];bool cmp(Node x, Node y) {if (x.c == y.c) return x.a < y.a;return x.c < y.c;
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; i ++ ) cin >> bit[i].a;for (int i = 1; i <= n; i ++ ) cin >> bit[i].b;for (int i = 1; i <= n; i ++ ) cin >> bit[i].c;for (int i = 1; i <= n; i ++ ) {// 1->0if (bit[i].b < bit[i].a) one_to_zero[ ++ n1] = bit[i].c;// 0->1if (bit[i].a < bit[i].b) zero_to_one[ ++ n2] = bit[i].c;// 1->1if (bit[i].a && bit[i].b) is_one[ ++ n3] = bit[i].c;}// 1->0sort(one_to_zero + 1, one_to_zero + n1 + 1);// 0->1sort(zero_to_one + 1, zero_to_one + n2 + 1);// 1->0->1, we should first choose bigger onesort(is_one + 1, is_one + n3 + 1);for (int i = 1; i <= n1; i ++ ) pre1[i] = pre1[i - 1] + one_to_zero[i];for (int i = 1; i <= n2; i ++ ) pre2[i] = pre2[i - 1] + zero_to_one[i];// res means probable-answer, ans means real-answer, sum_one_one means the sum of is_onell res = 0, ans = 0, sum_one_one = 0;// if we don't make 1->0->1, any 1 will be add for each timefor (int i = 1; i <= n3; i ++ ) sum_one_one += is_one[i];res += (n1 + n2) * sum_one_one;// we first make 1->0, bigger one should be flipped first// caution! don't add the biggest onefor (int i = 1; i < n1; i ++ ) res += pre1[i];// then make 0->1, smaller one should be flipped firstfor (int i = 1; i <= n2; i ++ ) res += pre2[i];ans = res;// now we consider trying to make some 1->0->1 from 1 to 0 and check if it has lower answer// let l be a point of zero_to_one, r be a point of one_to_zeroint l = n1, r = n2;// if we choose c[i] which is 1->0->1, we should do as what we do before to make 1->0 and 0->1for (int i = n3; i; i -- ) {// the smaller elements in one_to_zero will be add againwhile (l && one_to_zero[l] > is_one[i]) l -- ;// the smaller elements in zero_to_one will be add againwhile (r && zero_to_one[r] > is_one[i]) r -- ;// remove is_one[i]sum_one_one -= is_one[i];// is_one[i] should be added n1+n2+2*(n3-i) times, but now n1-l+n2-r+1+2*(n3-i) timesres -= is_one[i] * (l + r - 1);// rest is_one will be added 2 more timesres += sum_one_one * 2;// smaller 1->0 will be added 1 more time, smaller 0->1 will be added 1 more timeres += pre1[l] + pre2[r];// remember update ansans = min(ans, res);}cout << ans << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025-03-12 随笔

今天周三,天气不错,记

线上测试木舟物联网平台之如何通过HTTP网络组件接入设备

一、概述 木舟 (Kayak) 是什么?木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台。支持异步和响应式编程开发,功能包含了物模型,设备,产品,网络组件的统一管理和微服务平台下的注册中心,服务路由,模块,中间服务等管理。还…

经过 10 亿级性能验证的隐私计算开源利器

在数据驱动的时代,我们每天都在产生大量数据:购物记录、健康信息、社交关系……这些数据蕴含巨大价值,但也伴随着隐私泄露的风险。 试想一下:医院希望联合研究某种疾病,但患者数据无法直接共享。 银行想合作分析反欺诈信息,但客户隐私数据必须严格保护。 AI 公司需要使用…

值得推荐的IT公司名单(国企篇)

大家好,今天我们来盘点一下值得推荐的国企,这些企业在行业内具有举足轻重的地位,不仅主营业务突出,福利待遇优厚,尤其是研发岗位的薪资区间,更是让人眼前一亮。十大顶尖央企国企,待遇优厚如天花板级别!(排名不分先后)1、中国烟草总公司 人家都说能成为烟草总公司的一…

Entity Framework Core 数据库迁移

EF Core 通过两种方式来保持**模型**和**数据库架构**同步。 迁移 Code First 反向工程 Db First 管理迁移 通过EF Core 命令行工具来管理迁移 安装EF Core 命令行工具# 安装 dotnet-ef dotnet tool install --global dotnet-ef# 验证安装 dotnet ef# 更新工具 dotnet tool upd…

Roslyn 分析器已知问题 传递项目属性时将忽略分号之后的内容

本文记录 Roslyn 分析器、源代码生成器的已知问题,通过CompilerVisibleProperty 传递值时,所有在 `;`、`#` 和换行符之后的字符都会被忽略相关问题链接:https://github.com/dotnet/roslyn/issues/43970 https://github.com/dotnet/roslyn/issues/51692此问题由 walterlv 发现…

Avalonia 已知问题 继承滚动条将让里层控件无法获得无穷大空间

本文记录 Avalonia 的一个已知问题,如果有代码里面编写一个类型继承 ScrollViewer 类型,然后这个类型里面啥都不做。那将会导致所有放在此滚动条里面的控件无法获取无穷大的空间,其宽高无法撑开,被限定为上层容器尺寸复现步骤如下:新建一个 FooScrollViewer 类型,让其继承…

读DAMA数据管理知识体系指南17数据存储和操作治理

读DAMA数据管理知识体系指南17数据存储和操作治理1. 管理数据库性能 1.1. 数据库的性能取决于两个相互依赖的因素:可用性和响应速度 1.2. 性能包括确保空间的可用性、查询优化以及其他能使数据库以有效的方式返回数据的因素1.2.1. 如果没有可用性,就无法衡量数据库的性能1.2.…

干货分享!厦大140页PPT读懂大模型,从概念到实践

干货分享!厦大140页PPT读懂大模型 《厦门大学:大模型概念、技术与应用实践》 是由厦门大学大数据教学团队出品的DeepSeek科普类内容。文章涵盖:人工智能发展简史 人工智能思维 大模型:人工智能的前沿 AIGC应用与实践内容分享:引言 在数字化浪潮汹涌澎湃的当下,大模型如同…

一款基于.NET开源、强大的网络管理和网络问题排查工具!

前言 今天大姚给大家分享一款基于.NET开源、免费、功能强大的网络管理和网络问题排查工具:NETworkManager。 项目介绍 NETworkManager 是一个基于.NET开源(GPL-3.0 license)、免费、功能强大的开源工具,旨在帮助用户管理和解决网络问题。通过提供一系列网络连接和管理工具,…

Palera1n之苹果手机越狱,iOS15~iOS 18有根越狱方法

iOS15/16/17/18越狱教程用到的工具为palra1n ,该工具支持使用Sileo商店并安装插件。其他越狱方式可参考:https://www.cnblogs.com/codtina/可以添加对其他 arm64 Darwin 设备的支持,包括 Apple TV、HomePod 和 Darwin 21 及更高版本上的 iBridge,但目前不受支持。 永远不会支…