题意:

你有一个长度为 \(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;
}

3.6 模拟赛T3 题解的更多相关文章

  1. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  2. 20180520模拟赛T3——chess

    [问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...

  3. 2020.3.23 模拟赛游记 & 题解

    这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...

  4. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  5. 20180711模拟赛T3——聚变

    文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...

  6. 20161005 NOIP 模拟赛 T3 解题报告

    subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...

  7. 2017-10-6模拟赛T3 丝(filament)

    题目 题解 20分实在想不到是什么做法…… 40分做法,从小到大枚举最小循环节长度,O(n) check即可,总复杂度O(n^2). 100分做法: 看到数据范围,T*n<=10^6,可知这题需 ...

  8. 2017-9-3模拟赛T3 密码(key)

    题目 题解 这题用类似暴力+优化(划掉)的思想. 对于每个轨迹串,求出每一位向后的第一个0-9间某个数字的位置(如123112中3后面第1个2的位置为从左往右数第6个),复杂度O(Σn)=O(L). ...

  9. 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...

  10. NOIP模拟赛10 题解

    t3: 题意 给你一棵树,然后每次两种操作:1.给一个节点染色 : 2. 查询一个节点与任意已染色节点 lca 的权值的最大值 分析 考虑一个节点被染色后的影响:令它的所有祖先节点(包括自身)的所有除 ...

随机推荐

  1. WPF后台自动添加控件Demo

    xaml <Window x:Class="EBPlugIn2.EBPlugIn2_YJW_13" xmlns="http://schemas.microsoft. ...

  2. 不同版本AutoCAD的ProgID

    AutoCAD产品名 ProgID AutoCAD 2004 AutoCAD.Application.16 AutoCAD 2005 AutoCAD.Application.16.1 AutoCAD ...

  3. 2024网鼎杯青龙组Misc详解

    MISC01 某单位网络遭到非法的攻击,安全人员对流量调查取证之后保存了关键证据,发现人员的定位信息存在泄露,请对其进行分析.flag为用户位置信息进行32位md5哈希值 位置信息,所有我们开始试ip ...

  4. AD 横向移动-TGS-REP Kerberoasting 攻击

    本文通过 Google 翻译 AD Escalation – Kerberoasting Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前 ...

  5. 我的Vue之旅(3)

    2020-10-24 程序员节快乐哈! 因为有相当一部分内容都是相互穿插的,今天也就不写那么多重复的Demo了,直接写一下对所学内容的理解吧. 插值 关于插值这一块其实也没啥说的,文本插值都是最熟悉不 ...

  6. 飞牛OS给容器魔方上行宽带限速

    下面我将详细讲解(容器网络命名空间限速)的持久化配置步骤,确保在飞牛OS重启后自动生效.请严格按照顺序执行以下操作: ️ 完整持久化配置教程(带详细解释) 步骤1:确认容器魔方名称 # 查看运行的容器 ...

  7. linux 使用ll查看文件发现文件后面带 *

    结论:如果你看到带 * 的文件名,通常意味着这个文件具有可执行权限. 使用alias ll检查 ll 是不是一个别名,以及它具体代表什么命令. 检查的结果如下:alias ll='ls -alF' 在 ...

  8. MySQL查询优化的步骤

    本文由 ChatMoney团队出品 MySQL查询优化是提高数据库性能的关键步骤之一.通过优化查询,可以减少数据库的负载,提高查询速度,从而提高整个应用程序的性能. 选择合适的索引 索引是数据库中用于 ...

  9. GAMES101作业1

    声明:使用的是vs2022版,以下内容如有问题,感谢各位大佬指正! 作业要求: 作业目的:模拟一个基于 CPU 的光栅化渲染器的简化版本 我们需要做的: 在main.cpp中修改 Eigen::Mat ...

  10. 十、buildroot系统 桌面配置

    4.4.桌面控制 4.4.1.weston 文件夹路径 /common/overlays/10-weston 1.核心设置 配置 Weston 的核心设置 文件 /etc/xdg/weston/wes ...