P10068 [CCO 2023] Line Town

news/2025/10/8 15:55:42/文章来源:https://www.cnblogs.com/cjoierzdc/p/19129742

考察符号的变化,如果是一正一负那么不会变,否则是两位一起奇偶翻转。把奇数位的符号翻转后,每个数可以认为是一个绝对值和符号的二元组。

对于序列最终的形态,其一定是一段负然后一些 \(0\) 再一段正,翻转后就是一段前缀 \(+-+-\cdots\),一段后缀 \(+-+-\cdots +(-)\),最后一位的正负号已知。同时前缀的绝对值递减,后缀的绝对值递增。注意前缀和后缀可以为空。

考虑按绝对值从大往小插数,同时记录 \(f_{0/1,0/1}\) 为当前序列左右分别要求的符号。

转移枚举分别有多少个数放在左右。贡献可以拆成距离和,同侧贡献和异侧贡献。变化量可以用 \(O(1)\) 次二分计算,写起来较为复杂。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int> ;const int kN = 5e5 + 5;
int n;
pii a[kN];
int ord[kN];
ll f[2][2];struct BIT {int tr[kN];void Clear() {fill_n(tr, n + 3, 0);}void Update(int x, int v) {for(; x <= n; x += (x & -x)) tr[x] += v;}int Query(int x) {int ans = 0;for(; x; x &= (x - 1)) ans += tr[x];return ans;}
}bit;void DP(int N, int l, int r) {vector<int> v[2];int dif = 0;for(int i = l; i <= r; i++) {int x = ord[i];bool f = a[x].second;v[f].push_back(bit.Query(x));f ? dif++ : dif--;}auto Calc = [&](int fs, int ft, int ns, int nt) -> ll {deque<int> p[2], q[2];int c[2][2];c[0][0] = v[0].size();c[0][1] = 0;c[1][0] = v[1].size();c[1][1] = 0;auto P = [&](bool f, int c) -> int {return f ? N - (2 * c - 1) + ft : N - 2 * (c - 1) - ft;};auto S = [&](bool f, int i, bool g) -> int {return g ? v[f][i + c[f][0]] : v[f][i]; };auto T = [&](bool f, int i, bool g) -> int {return g ? q[f][i] : p[f][i];};for(int i = 0; i < c[0][0]; i++) {p[0].push_back(fs + 1 + 2 * i);}for(int i = 0; i < c[1][0]; i++) {p[1].push_back(2 - fs + 2 * i);}if(ft != nt) {c[ft][0]--, c[ft][1]++;p[ft].pop_back();q[ft].push_front(P(ft, c[ft][1]));}ll ans = 1e18;ll cost = 0;for(int i : {0, 1}) {for(int j = 0; j < c[i][0]; j++) {cost += v[i][j] - p[i][j];}for(int j = 0; j < c[i][1]; j++) {cost += q[i][j] - v[i][j + c[i][0]];}}for(int f : {0, 1}) for(int g : {0, 1}) for(int h : {0, 1}) {for(int i = 0; i < c[g][f]; i++) {int si = S(g, i, f), ti = T(g, i, f);int l = -1, r = c[!g][h], p = r;while(l + 1 < r) {int mid = (l + r) >> 1;(S(!g, mid, h) >= si) ? (p = r = mid) : (l = mid);}l = -1, r = c[!g][h];while(l + 1 < r) {int mid = (l + r) >> 1;(T(!g, mid, h) <= ti) ? (l = mid) : (r = mid);}int cnt = max(l - p + 1, 0);(f == h) ? (cost += cnt) : (cost -= cnt);}}while(1) {ans = min(ans, cost);if(!c[0][0] || !c[1][0]) break;{int i = c[0][0] - 1;int j = c[1][0] - 1;int si = S(0, i, 0), ti = T(0, i, 0);int sj = S(1, j, 0), tj = T(1, j, 0);cost += ((si <= sj) && (ti >= tj));cost += ((si >= sj) && (ti <= tj));}for(int f : {0, 1}) for(int g : {0, 1}) {int i = c[f][0] - 1;int si = S(f, i, 0), ti = T(f, i, 0);int l = -1, r = c[!f][g];while(l + 1 < r) {int mid = (l + r) >> 1;(S(!f, mid, g) >= si) ? (r = mid) : (l = mid);}int pl = l, pr = r;l = -1, r = c[!f][g];while(l + 1 < r) {int mid = (l + r) >> 1;(T(!f, mid, g) <= ti) ? (l = mid) : (r = mid);}int v = max(l - pr + 1, 0) + max(pl - r + 1, 0);g ? cost += v : cost -= v;}for(int t : {0, 1}) {cost -= v[t][c[t][0] - 1] - p[t][c[t][0] - 1];c[t][0]--, c[t][1]++;p[t].pop_back();q[t].push_front(P(t, c[t][1]));cost += q[t][0] - v[t][c[t][0]];}{int i = 0;int j = 0;int si = S(0, i, 1), ti = T(0, i, 1);int sj = S(1, j, 1), tj = T(1, j, 1);cost -= ((si <= sj) && (ti >= tj));cost -= ((si >= sj) && (ti <= tj));}for(int f : {0, 1}) for(int g : {0, 1}) {int i = 0;int si = S(f, i, 1), ti = T(f, i, 1);int l = -1, r = c[!f][g];while(l + 1 < r) {int mid = (l + r) >> 1;(S(!f, mid, g) >= si) ? (r = mid) : (l = mid);}int pl = l, pr = r;l = -1, r = c[!f][g];while(l + 1 < r) {int mid = (l + r) >> 1;(T(!f, mid, g) <= ti) ? (l = mid) : (r = mid);}int v = max(l - pr + 1, 0) + max(pl - r + 1, 0);g ? cost += v : cost -= v;}}return ans;};ll tf[2][2];memcpy(tf, f, sizeof(tf));memset(f, 0x3f, sizeof(f));for(int fs : {0, 1}) for(int ft : {0, 1}) {if(tf[fs][ft] > 1e16) continue;for(int ns : {0, 1}) for(int nt : {0, 1}) {int nd[2] = {0, 0};if(fs != ns) nd[fs]++;if(ft != nt) nd[ft]++;if(nd[1] - nd[0] != dif) continue;f[ns][nt] = min(f[ns][nt], tf[fs][ft] + Calc(fs, ft, ns, nt));}}for(int i = l; i <= r; i++) bit.Update(ord[i], -1);
}int main() {
//  freopen("1.in", "r", stdin);
//  freopen("1.out", "w", stdout);ios::sync_with_stdio(0), cin.tie(0);cin >> n;for(int i = 1; i <= n; i++) {int x;cin >> x;a[i] = pii {abs(x), (x > 0) ^ (i & 1)};}iota(ord + 1, ord + n + 1, 1);stable_sort(ord + 1, ord + n + 1,[&](int x, int y) { return a[x] > a[y]; });for(int i = 1; i <= n; i++) bit.Update(i, 1);memset(f, 0x3f, sizeof(f));f[1][(n & 1) ^ 1] = 0;for(int rem = n, l = 1, r; l <= n; l = r + 1) {pii val = a[ord[l]];if(!val.first) break;for(r = l; r < n; r++) {pii nxt = a[ord[r + 1]];if(val.first != nxt.first) break;}DP(rem, l, r);rem -= (r - l + 1);}ll ans = 1e18;for(int i : {0, 1}) {for(int j : {0, 1}) ans = min(ans, f[i][j]); }cout << ((ans > 1e16) ? -1 : ans) << "\n";return 0;
}

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

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

相关文章

AI元人文:共识锚定与智慧剪枝——构建人机共生认知经济体的完善理论体系与实践路径

AI元人文:共识锚定与智慧剪枝——构建人机共生认知经济体的完善理论体系与实践路径 在人工智能从“工具性辅助”迈向“社会性参与”的临界点,我们面临的已非单纯的技术瓶颈,而是文明层级的融合困境。其一为价值漂移…

网站页面优化工具沈阳网站关键词优化服务好

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…

羊蹄

羊蹄cf104679E:埃式筛法+前缀和 问题:对于节点为 1..N,若两个数有公共质因子(gcd(a, b) > 1)则在它们之间连一条无向边。问哪些点与 2 不连通? 数x与其最小质因子p连通(p ↔ x),当其与2不连通时,可以找到一中…

出题系统

又完善了一下,更好用了 代码如下: class Nums { public double GetTrue(){return True;} public double GetFalse() {return False;} public int GetCurrent() {return Current;} public int GetMAX() {return MAX;}…

io控制方式

程序直接控制方式 完成一次读写操作的流程(以读操作为例子) 1.cpu向控制器发出读指令,于是设备启动,并且状态寄存器设置为1(未就绪) 2.轮询检查控制器的状态 3.输入设备准备好数据后,将数据传给控制器,并且报告…

【基础】 - ACPI是什么?

【基础】 - ACPI是什么?ACPI(高级配置与电源接口)表格是固件与内核间的“硬件说明书”,包含设备拓扑、电源管理、中断路由等关键信息,直接影响内核对硬件的识别与控制。Linux内核通过解析ACPI表格实现硬件抽象,而…

我 是 人 机

花了两天时间把 Im Not A Robot 通关了,真有意思。 下面分享一下我的通关历程。 正解 Level 1 直接点即可。 Level 2 选择所有含有 STOP 标志的方块。 直接选即可。 Level 3 填字母。瞪两下就能看出来了。 Level 4 选…

28定律及其扩展衍生

28定律及其扩展推演 28定律这四个字是十分简洁凝练的,它及其衍生描述可以用来描述身边的大多数现象。 描述 28定律的描述: 1.我第一次接触28定律是在对社会经济描述上:“社会20%的人掌握全社会80%以上的财富。” 2.…

电脑怎么创建网站吗科技创新的重要前沿是

fastermaker-boot 是基于Spring Boot3 、Vue3 的一个代码简洁、结构清晰、开发高效、模块可扩展的单体项目的基础开发框架&#xff0c;包含代码生成器模块&#xff0c;适合初级开发者特别是大学生学习研究使用&#xff0c;也是中小型系统快速开发的利器。 开发技术: JDK 17、Sp…

广东省人防工程建设网站wordpress首页打开很慢

植物神经紊乱是一种内脏功能失调的综合征&#xff0c;是由于社压会力、工作压力、生活压力等等因素而导致的一种神经类疾病。长期患有这个疾病会给患者的生活、工作以及学习带来很严重的影响和危害。 有很多患有植物神经紊乱的患者&#xff0c;各种各样的症状的患者被所轻或重的…

3516cv610在sample_aiisp上多创一路编码流,方法 - 详解

3516cv610在sample_aiisp上多创一路编码流,方法 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

网站建设与维护技术浅谈论文代理加盟做什么好

http://cplusoj.com/d/senior/p/SS231025D 答案为 ∑ w [ x ] − w [ s o n [ x ] ] \sum w[x]-w[son[x]] ∑w[x]−w[son[x]]&#xff0c; x x x 非儿子 要维护断边&#xff0c;LCT固然可以&#xff0c;但不一定需要 发现如果发生了变化&#xff0c;只会由重儿子变成次重儿子…

注册公司制作网站门户网站建设维护

LRU是什么意思 LRU是操作系统底层的一个页面置换算法&#xff0c;当空间不够需要换出最长时间没有使用的页面&#xff0c;在本题中的意思就是当到达容量上限的时候要换出最长时间没有被访问过的节点。 如何实现 LRU的实现可以使用链表的方式&#xff0c;参照MySQL的实现&…

手机模板网站模板下载工具网络网站建设推广

GODADDY的虚拟主机控制面板虽然使用起来非常方便&#xff0c;对于文件管理的很多操作也非常到位&#xff0c;但是有一个非常令人头疼的问题&#xff0c;就是GODADDY在 主机控制面板中只支持小于20M的文件打包&#xff0c;这对于大部分的站长朋友来说&#xff0c;是非常不方便的…

方法作业

https://files.cnblogs.com/files/blogs/847621/20243866牛蕴韬01方法作业.zip?t=1759908795&download=true

公司网站建设属于软件销售湖南金科建设有限公司网站

任何程序都可能出现错误&#xff0c;在SQL Server中执行Transact-SQL也不例外。如果在Transact-SQL中发生了错误&#xff0c;一般有两种捕捉错误的方法&#xff0c;一种是在客户端代码&#xff08;如 c#、delphi等)中使用类似try...catch的语句进行捕捉&#xff1b;另外一种就是…

网站登录入口大全网站制作预算

作用&#xff1a;线程安全的全局静态变量初始化 声明&#xff1a; Q_GLOBAL_STATIC(MyType,globalState) Q_GLOBAL_STATIC_WITH_ARGS(MyType, globalState, (42, "Hello", "World")) //带参数的初始化 注&#xff1a; 构造函数和析构函数必须是公有的 如果…

实现仿中国婚博会微信小应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[100ask_imx6ullpro] buildroot构建emmc镜像并烧录

[100ask_imx6ullpro] buildroot构建emmc镜像并烧录 本文参考百问网韦东山老师视频 嵌入式Linux系统裁剪移植之二:使用Buildroot制作根文件系统 本文的主机环境为 Ubuntu22.04 1.准备工作 1.1.下载buildroot 从官网下载…

湘潭网站建设厦门网站制作wordpress页面排版插件

抖音API允许开发者进行二次开发&#xff0c;使得第三方应用程序可以与抖音进行交互。要将抖音API应用于抖音视频的录制和上传&#xff0c;你需要遵循以下步骤&#xff1a; 获取抖音API密钥&#xff1a;首先&#xff0c;你需要从抖音官网注册一个开发者账号&#xff0c;并创建一…