3.6 模拟赛T3 题解

news/2025/3/13 12:00:32/文章来源:https://www.cnblogs.com/YhjOI/p/18758550

题意:

你有一个长度为 \(2\times n+1\) 的随机排列。现在每次操作从排列中间选一个数出来放入一个集合 \(S\) 中(从排列中将其删掉),并且如果不是最后一次操作(即不是序列只剩一个数),我们再在排列中任选一个数并删除它。那么最后 \(S\) 中一定会有 \(n + 1\) 个数,现在我们想知道这个集合中连续值域最长长度是多少。

思路:

首先可以明确一点的是,因为这是排列,所以每一个数都具备唯一性。那么现在我们想要关注最终这个 \(S\) ,有可能变成什么一种形式。重复推一组样例,并且模拟最终不同的 \(S\)。比如:
然后你就发现我们第一次只能选数字 \(6\),然后第二次可以选数字数字 \(1,3\),第三次按照规律......
分析之后发现只要在当前步数对应的区间中不曾被选择那么就可以选择。然后你还可以发现每个数都会有一个类似于可选机会的信息,比如最中间的我可以有最多次的机会选择,两侧的其次......(受不了了,讲这玩意太抽象了)。
形式化的定义就是:对于每一个数 \(a_i\),定义 \(pre_{a_i}=\max(2\times n+1-i+1,i)\)
然后考虑如何判断一段连续值域是否合法,不妨记 \(t_k\) 表示考虑的这一段区间内可选机会小于等于 \(k\) 的元素个数,你发现如果满足:

\[t_k = \sum_{i=l}^r[p_i\leq r] > k \]

则这个区间无解(这一坨实在是直接用文字描述了,所以请读者结合上述样例理解)。把上述不等式移项得:

\[t_k - k>0 \]

你发现这个玩意看着很舒服,形式整洁,所以定义:

\[f(k)=t_k-k \]

定义域就是 \([1,n + 1]\)
如果我们希望这个区间合法,也就等价于希望:

\[\forall_{k\in[1,n+1]}\ f(k)\leq 0 \]

我们如果真的把所有 \(k\) 都这么算出来,复杂度肯定是接受不了的,但是发现上述条件还等价于:

\[\forall_{k\in[1,n+1]}\ f(k)_{\max}\leq0 \]

所以我们只需要维护最大值。这个可以用线段树解决(因为是区间修改加区间查询,树状数组写起来反而更麻烦。)。考虑如何找答案,其实可以双指针,每一次移动指针的判断结合线段树是 \(O(\log n)\)的又因为双指针是 \(O(n)\) 的,所以最后的复杂度是 \(O(n\log n)\)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector> 
inline int read(){char c=getchar();bool f=0;int x=0;while(c > '9' || c < '0') f|=c=='-',c=getchar();while(c >= '0'&&c <= '9') x=(x<<1)+(x<<3)+(c^48),c=getchar();if(f) x=-x;return x;
}
const int N = 4e5 + 10;
struct Segment_tree {int lazy,mx;
}t[N << 1];
int n,a[N],pre[N];void pushup(int rt)
{t[rt].mx = std::max(t[rt << 1].mx,t[rt << 1 | 1].mx);
}void push_down(int rt)
{if(t[rt].lazy){t[rt << 1].lazy += t[rt].lazy;t[rt << 1 | 1].lazy += t[rt].lazy;t[rt << 1].mx += t[rt].lazy;t[rt << 1 | 1].mx += t[rt].lazy;t[rt].lazy = 0;		}
}void build(int rt,int l,int r)
{t[rt].lazy = 0;if(l == r){t[rt].mx = -l;return ;	}int mid = (l + r) >> 1;build(rt << 1,l,mid);build(rt << 1 | 1,mid + 1,r);pushup(rt);
}void update(int rt,int l,int r,int L,int R,int x)
{if(L <= l && r <= R){t[rt].lazy += x;t[rt].mx += x;return ;}int mid = (l + r) >> 1;push_down(rt);if(L <= mid) update(rt << 1,l,mid,L,R,x);if(R > mid) update(rt << 1 | 1,mid + 1,r,L,R,x);pushup(rt); 
}int main() 
{n = read();for(int i = 1;i <= 2 * n + 1;++i){a[i] = read();pre[a[i]] = std::min(i,2 * n + 1 - i + 1);}build(1,1,n + 1);int ans = 0;int r = 0,l = 1;while(l <= 2 * n + 1 && r <= 2 * n + 1){while(r <= 2 * n){update(1,1,n + 1,pre[++r],n + 1,1);if(t[1].mx > 0) {update(1,1,n + 1,pre[r--],n + 1,-1);break;}}ans = std::max(ans,r - l + 1);update(1,1,n + 1,pre[l++],n + 1,-1);}std::cout << ans;return 0;
}

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

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

相关文章

JavaScript-编程精解-Eloquent-第四版-二-

JavaScript 编程精解(Eloquent)第四版(二)译者:飞龙 协议:CC BY-NC-SA 4.0第七章:对象的秘密生活 第四章介绍了JavaScript中的对象作为持有其他数据的容器。在编程文化中,面向对象编程是一套以对象为程序组织核心原则的技术。 尽管没有人真正同意它的确切定义,面向对象…

【学习笔记】连通性相关

Learning强连通分量定义 强连通是指在有向图中任意两节点 \(u,v\) 可相互到达,我们称 \(u,v\) 两点强连通。 强连通分量(Strongly Connected Compoments,SCC)是指极大的强连通子图。 如何求强连通分量算法一:Tarjan 最常用的就是 Tarjan 算法。 前置算法:DFS 生成树。 顾名…

[GDOUCTF 2023]doublegame wp

一个游戏为贪吃蛇,另一个游戏maze 在string里面能够直接看到迷宫点击查看代码 000000000000000000000 0 0 0 0 0 0 0 0 0 0 00000 00000 0 0 0 0 0 0 0 000 000 0 000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00000 000 000 0 0 0 0 0 0 0 0 000 …

React—12—ReactRouter

一、路由 ◼ 路由其实是网络工程中的一个术语:  在架构一个网络时,非常重要的两个设备就是路由器和交换机。  当然,目前在我们生活中路由器也是越来越被大家所熟知,因为我们生活中都会用到路由器:  事实上,路由器主要维护的是一个映射表;  映射表会决定数据的流…

如何将立创EDA/Altium Designer绘制的原理图导入/转换为Visio格式

相信各位写论文的学生在绘制论文电路图的时候都有苦恼,手绘太烦太累,在AD或立创EDA上已经绘制的又没有方便的导入软件 me too,直至今天找到一种非常方便的导入方式,除了拐角处有那么一丢丢缺陷其他感觉不错,下面予以介绍,顺便做个记录以防自己再忘了。 思路 PCB原理图的绘…

新版本将飞飞资源提取到unity中

旧版本方法:飞飞资源提取工具atools→3DMAX→unity 旧版文章链接:[Unity3D] 如何将飞飞游戏资源提取并加载到uinty3d中 - 伊凡晴天 - 博客园新版方法:飞飞资源提取工具atools→blender3.6→unity 新版方法视频:如何将飞飞游戏资源提取到unity中_哔哩哔哩_bilibili飞飞资源提取工…

电压转换模块

一、DCDC,LDO,电压基准的区别? DCDC电源转换电路可以承受大的压差,输出电流也比较大,带负载能力强,随随便便可以有几A的电流输出 DCDC即可以降压,还可以升压,而LDO只能降压。 LDO又叫线性稳压器,他的特点是输入电流和输出电流相当,这就造成了一个特别巨大的问题,就是…

多线程程序设计(二)——Immutable

本文摘要了《Java多线程设计模式》一书中提及的 Immutable 模式的适用场景,并针对书中例子(若干名称有微调)给出一份 C++ 参考实现及其 UML 逻辑图,也列出与之相关的模式。 ◆ 适用场景 多个线程在同时访问共享数据时,只需要读取数据而不必修改数据。 ◆ 解决方案 无需使用…

第三周第五天

所用时间:315分钟 代码量(行):197 博客量(篇):1 了解到的知识点: 1.完成了简单的安卓程序开发 通过springboot后端应用服务器将安卓程序插入到mysql数据库 程序页面如下:刚开始添加好一会儿都进不去,原来是服务器没弄好,服务器路径一定要搞好 我测试用的路径:url(&…

第二次作业-个人项目

第二次作业这个作业属于哪个课程 第二次作业这个作业要求在哪里 作业要求这个作业的目标 完成论文查重程序Github仓库地址 https://github.com/Simonysc-123/3123004761PSP2.1 Personal Software Process Stages 预估耗时(分钟 实际耗时(分钟)Planning 计划 10 15Estimate 估…