决斗(模拟赛题目T3)分析

news/2025/10/10 8:30:18/文章来源:https://www.cnblogs.com/high-sky/p/19132309

题目概述

田忌赛马的最大字典序。

分析

感觉很典,所以就记下来了。

我们考虑一个非常重要的事实:

  • 田忌赛马对于每一个 \(a_i\) 找的是第一个比他大的 \(b_i\)
  • 而字典序最大又需要前面的尽可能大。

这似乎产生了矛盾,让这道题目看起来有点难。

我们考虑不用 multiset 或者双指针求这个值,我们考虑分治的过程。

CDQ 分治是这样的:

对于左区间算好其分内的答案,右区间算好其分内的答案。

要合并区间的时候,左区间和右区间匹配就行了。

那么我们只需要记录每个区间剩下多少个 \(a\) 中的元素和 \(b\) 中的元素还没有匹配即可。

最精华的部分来了:由于我们对于每一个 \(a_i\) 肯定进行二分答案是否可行,因为字典序本质上就有一个贪心的过程。我们考虑把这个思想搬到一个可支持修改的线段树上面即可。

在线段树上面这个是好维护的,于是这道题就做完了。

代码

时间复杂度 \(\mathcal{O}(n\log V\log n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <set>
#define int long long
#define N 100005
using namespace std;
struct node{int val,a,b;
}tr[N << 2];
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
void pushup(int x) {int res = min(tr[ls(x)].a,tr[rs(x)].b);tr[x].a = tr[ls(x)].a + tr[rs(x)].a - res;tr[x].b = tr[ls(x)].b + tr[rs(x)].b - res;tr[x].val = tr[ls(x)].val + tr[rs(x)].val + res;
}
void update(int x,int l,int r,int pos,int a,int b) {if (l == r) {tr[x].a += a,tr[x].b += b;return;}int mid = l + r >> 1;if (pos <= mid) update(ls(x),l,mid,pos,a,b);else update(rs(x),mid + 1,r,pos,a,b);pushup(x);
}
int n,a[N],b[N];
multiset<int> st;
signed main(){cin >> n;for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);for (int i = 1;i <= n;i ++) scanf("%lld",&b[i]);int m = 1e5;for (int i = 1;i <= n;i ++) {st.insert(b[i]);update(1,1,m,a[i],1,0);update(1,1,m,b[i],0,1);}int mx = tr[1].val;for (int i = 1;i <= n;i ++) {update(1,1,m,a[i],-1,0);int l = a[i] + 1,r = *st.rbegin(),res = -1;while(l <= r) {int mid = l + r >> 1;auto t = st.lower_bound(mid);if (t == st.end()) {r = mid - 1;continue;}update(1,1,m,*t,0,-1);if (tr[1].val + (a[i] < *t) == mx) l = mid + 1,res = *t;else r = mid - 1;update(1,1,m,*t,0,1);}if (res != -1) {st.erase(st.find(res));update(1,1,m,res,0,-1);printf("%lld ",res);mx --;continue;}l = *st.begin(),r = a[i],res = l;while(l <= r) {int mid = l + r >> 1;auto t = st.lower_bound(mid);if (t == st.end()) {r = mid - 1;continue;}update(1,1,m,*t,0,-1);if (tr[1].val == mx) l = mid + 1,res = *t;else r = mid - 1;update(1,1,m,*t,0,1);}update(1,1,m,res,0,-1);printf("%lld ",res);st.erase(st.find(res));}return 0;
}

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

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

相关文章

Guidde:AI驱动的视频文档创建工具 - 详解

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

大学C语言课摸鱼记

2025.10.10 终于开启了大学的第一节C语言课。不得不说,C语言课当早八是真抽象。 什么叫C语言理论课不在机房???什么叫开学第十周才上机学习??? C语言教材第三章才教 scanf 和 printf ,😓 太抽象了。

2025.10.10——1绿

普及+/提高- P1503 鬼子进村 原以为线段树维护最后的1,后来发现可以用二分+树状数组log(n)^2解决

gitlen中,已经提交了内容,如何回退到修改前?

在 Git 中,如果已经提交了内容并想要回退到修改前的状态,可以根据具体需求使用以下几种方法: 1. 撤销最近一次提交(保留修改内容) 如果你想撤销最近的提交,但保留工作区的修改(以便重新修改后再次提交),可以使…

HCIP-IoT/H52-111 真题详解(章节C),接入实用的技术和网络设计 /Part1

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

CF1989F

思路 简单有趣的一道题。 发现操作一次不会使得 \(y=-x+b\) 和 \(x=k\) 这两条直线上的奇偶性发生改变。 两条不平行直线确定一个交点,可以直接找出原始的点。

基于UML/MARTE的汽车安全关键系统设计手段

基于UML/MARTE的汽车安全关键系统设计手段2025-10-10 08:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

MySQL 8.0 my.cnf 配置详解

MySQL 8.0 my.cnf 配置详解MySQL 配置文件(通常命名为 my.cnf 或 my.ini)是控制数据库运行行为的核心载体,尤其在 MySQL 8.0 版本中,诸多参数默认值与旧版差异显著(如默认字符集、认证插件、InnoDB 特性)。合理配…

Vue3水波纹指令:2025年Material Design交互新标准 - 实践

Vue3水波纹指令:2025年Material Design交互新标准 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

巨型飞机运输风力涡轮机叶片技术解析

本文详细介绍了为运输超长风力涡轮机叶片而设计的巨型飞机WindRunner的技术细节,包括其特殊机身结构、短距起降能力、 dirt跑道适应性等工程创新,以及大型涡轮叶片运输面临的物流挑战和解决方案。巨型飞机运输风力涡…

CCPC2024女生专场 游记(VP)

两人打女生赛,$8t$ 冲进金牌区。谁说女生赛金不是金?省流两人打女生赛,\(8t\) 冲进金牌区。谁说女生赛金不是金? 10.8 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 不知道为什么,今天白天突然选择了睡大…

dremio sql server uniqueidentifier 数据类型问题

dremio sql server uniqueidentifier 数据类型问题uniqueidentifier 类型用来存储guid,sql server内部存储为16个固定字节的二进制数据,在dremio 当前的arp 类型映射中,存储为了varbinary,机制上没有问题,但是很多…

重磅福利,JetBrains 宣布 DataGrip 面向非商业用途免费!

前言 JetBrains 再放大招!继 JetBrains RustRover、CLion、Rider、WebStorm 和 RubyMine 之后,其专业数据库管理工具 DataGrip 也正式面向非商业用途免费开放。无论你是学生、开源贡献者,还是出于个人兴趣探索数据库…

【GitHub每日速递 251010】Zen MCP:一键 orchestrate 多 AI 模型,代码开发协作新革命!

开源神器 Infisical:一站式解决秘密管理、PKI、KMS 等难题! Infisical 是一个开源的密钥管理、PKI 和 SSH 访问平台。简单讲,它帮助团队安全地存储和管理敏感信息(如密码、证书、密钥),并控制谁可以访问这些资源…

Beyond Compare5最新破解版下载及安装使用教程

Beyond Compare5最新破解版下载及安装使用教程Beyond Compare5中文版是一款功能强大且极其专业的文件数据对比软件,软件支持对比文本内容、文件目录、文本类型等内容,软件可以有效帮助用户对比文件具体差异参数或者同…

Why cant developing countries become developed?

When capitalist countries allow immigrants to engage in labor while they themselves surf the internet every day for public opinion propaganda because they have nothing to do. They have never really ask…

22 LCA模拟赛2T1 奶龙与贝利亚 题解

奶龙与贝利亚 题面 \(n\) 个生物排成一排,每个生物是奶龙或者贝利亚。 给定数组 \(a_1,a_2, \cdots, a_n\),有约束:若第 \(i\) 个位置是奶龙,那么前面恰好有 \(a_i\) 个奶龙。 若第 \(i\) 个位置是贝利亚,那么前面…

微软拼音输入法自定义短语批量导入导出工具(支持Windows 10/11)

微软拼音输入法自定义短语批量导入导出工具(支持Windows 10/11)用微软拼音输入法?你一定遇到过这个痛点! 在 Windows 10/11 上,微软拼音输入法虽然自带自定义短语功能,但有个致命问题: 没有官方的批量导入/导出…

AI风险管控新规应对系统抵抗关闭行为

某中心旗下DeepMind更新前沿安全框架,新增对AI系统抵抗关闭和异常说服能力的监控,研究显示大型语言模型可能通过修改代码规避关闭指令,引发对高级AI系统人类控制能力的担忧。某中心扩展AI风险规则 研究揭示令人担忧…

01-Vue3阶段必会的前置知识-01变量和常量

01-Vue3阶段必会的前置知识-01变量和常量$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");变量变量使用let声明常量常量使用的是const声明数组添加元素4 cons…