3.6 模拟赛T3 题解
题意:
你有一个长度为 \(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\) 的元素个数,你发现如果满足:
\]
则这个区间无解(这一坨实在是直接用文字描述了,所以请读者结合上述样例理解)。把上述不等式移项得:
\]
你发现这个玩意看着很舒服,形式整洁,所以定义:
\]
定义域就是 \([1,n + 1]\)。
如果我们希望这个区间合法,也就等价于希望:
\]
我们如果真的把所有 \(k\) 都这么算出来,复杂度肯定是接受不了的,但是发现上述条件还等价于:
\]
所以我们只需要维护最大值。这个可以用线段树解决(因为是区间修改加区间查询,树状数组写起来反而更麻烦。)。考虑如何找答案,其实可以双指针,每一次移动指针的判断结合线段树是 \(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 题解的更多相关文章
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 20180520模拟赛T3——chess
[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...
- 2020.3.23 模拟赛游记 & 题解
这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...
- 体育成绩统计——20180801模拟赛T3
体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...
- 20180711模拟赛T3——聚变
文件名: fusion 题目类型: 传统题 时间限制: 3秒 内存限制: 256MB 编译优化: 无 题目描述 知名科学家小A在2118年在计算机上实现了模拟聚变的过程. 我们将她研究的过程简化. 核 ...
- 20161005 NOIP 模拟赛 T3 解题报告
subset 3.1 题目描述 一开始你有一个空集,集合可以出现重复元素,然后有 Q 个操作 1. add s 在集合中加入数字 s. 2. del s 在集合中删除数字 s.保证 s 存在 3. c ...
- 2017-10-6模拟赛T3 丝(filament)
题目 题解 20分实在想不到是什么做法…… 40分做法,从小到大枚举最小循环节长度,O(n) check即可,总复杂度O(n^2). 100分做法: 看到数据范围,T*n<=10^6,可知这题需 ...
- 2017-9-3模拟赛T3 密码(key)
题目 题解 这题用类似暴力+优化(划掉)的思想. 对于每个轨迹串,求出每一位向后的第一个0-9间某个数字的位置(如123112中3后面第1个2的位置为从左往右数第6个),复杂度O(Σn)=O(L). ...
- 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解
传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...
- NOIP模拟赛10 题解
t3: 题意 给你一棵树,然后每次两种操作:1.给一个节点染色 : 2. 查询一个节点与任意已染色节点 lca 的权值的最大值 分析 考虑一个节点被染色后的影响:令它的所有祖先节点(包括自身)的所有除 ...
随机推荐
- Data wrangling:Join,Combine,and Reshape,in Pandas
Data wrangling:Join,Combine,and Reshape,in Pandas import pandas as pd import numpy as np Hierarchica ...
- ElementPlus插件的安装和使用
ElementPlus插件安装和使用 npm install element-plus --save src/main.ts新增 // 关键节点:全局注册 Element Plus,包含样式 impo ...
- 【中文】【吴恩达课后编程作业】Course 1 - 神经网络和深度学习 - 第四周作业(1&2)
[吴恩达课后编程作业]01 - 神经网络和深度学习 - 第四周 - PA1&2 - 一步步搭建多层神经网络以及应用 上一篇:[课程1 - 第四周测验]※※※※※ [回到目录]※※※※※下一篇: ...
- 微服务架构学习与思考(16):SOA架构与微服务架构对比分析?它们之间区别是什么?
什么是 SOA 架构 SOA(Service-Oriented Architecture) 架构是面向服务的架构,是一种将单体应用粗粒度的划分为服务的架构,其核心是将业务功能抽象为独立.可重用.松耦合 ...
- 不写代码,让 AI 生成手机 APP!保姆级教程
你现在看到的 APP,是我完全用 AI 生成的,一行代码都没写!怎么做到的呢? 大家好,我是程序员鱼皮.AI 发展很快,现在随随便便就能生成一个网站,但是怎么纯用 AI 开发能在手机上运行的 APP ...
- 解决Dev c++6版本中文输出乱码问题
解决Dev c++6.3版本中文输出乱码问题 1.遇到的问题 使用cout输出中文时出现乱码问题 如下图所示: 2.解决方法 找到[工具]--[编译选项]--勾选[编译时加入以下命令]并添加如下代码: ...
- 通过 AWS CLI 操作 AWS S3
AWS S3后台提供了上传文件的地方,但是大文件上传比较慢--- 几十kb/s.使用AWS CLI上传文件相对较快 1:安装CLI (这里环境是 Windows) 参考官方文档 :https://do ...
- C++ map案例学习总结
公司招聘5个员工,五名员工进入公司之后,需要指派员工在哪个部门工作 人员信息:姓名 年龄 电话 工资 等组成 通过Multimap进行信息的插入 保存 显示 分部门显示员工信息 显示全部员工信息 #i ...
- C# datagridView 表格渲染变色 ( 动态改变表格值) 绘制时改变表格值
private void DGV_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { ...
- vant批量选择删除列表
代码如下 <template> <div class="wrapp"> <button @click="onEdit">{{ ...