题解:AT_abc352_d [ABC352D] Permutation Subsequence
虽然比赛没打,但是想来水估值发表思路。
题意
给你一个 \(1\sim n\) 的排列,让你从中找一段长为 \(k\) 的子序列,使得这个子序列中的元素排序后数值连续。
分析
题意转换一下,先用结构体存储每个元素的编号和数值,按照数值排序。
于是这道题就成了:一个序列,让你求所有长 \(k\) 的子段中每个段编号极差的最小值。
所以我们需要维护每个段编号最大最小值,我选择了 ST 表。
其他做法维护也有很多,这里就不讲了。
code
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int w=1,s=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
return w*s;
}
const int maxn=1e6+10;
int n,k;
struct no
{
int d,id;
}a[maxn];
bool cmp(no x,no y)
{
return x.d<y.d;
}
int ma[maxn][22],mi[maxn][22];
void pre()
{
for(int j=1;j<=20;j++){
for(int i=1;i+(1<<j)-1<=n;i++)
mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
}
for(int j=1;j<=20;j++){
for(int i=1;i+(1<<j)-1<=n;i++)
ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);
}
}
int askmax(int l,int r)
{
int le=l,ri=r;
int len=log2(ri-le+1);
return max(ma[le][len],ma[ri-(1<<len)+1][len]);
}
int askmin(int l,int r)
{
int le=l,ri=r;
int len=log2(ri-le+1);
return min(mi[le][len],mi[ri-(1<<len)+1][len]);
}
signed main()
{
// freopen("xxx.in","r",stdin);
// freopen("xxx.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
a[i].d=read();
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)swap(a[i].d,a[i].id);
for(int i=1;i<=n;i++)mi[i][0]=ma[i][0]=a[i].d;
pre();
int ans=1e9+7;
for(int l=1;l<=n-k+1;l++)
{
int r=l+k-1;
ans=min(ans,askmax(l,r)-askmin(l,r));
}
cout<<ans;
return 0;
}
题解:AT_abc352_d [ABC352D] Permutation Subsequence的更多相关文章
- 【题解】CF359B Permutation
[题解]CF359B Permutation 求一个长度为\(2n\)的序列,满足\(\Sigma |a_{2i}-a_{2i-1}|-|\Sigma a_{2i}-a_{2i-1}|=2k\) 这种 ...
- LeetCode题解之Longest Increasing Subsequence
1.题目描述 2.题目分析 使用动态规划,在计算以每个字符结尾的最长子序列. 3.代码 int lengthOfLIS(vector<int>& nums) { ){ ; } ve ...
- leetcode个人题解——#31 Next Permutation
写这题时脑子比较混乱,重写了一遍wiki大佬的解法. 算法: According to Wikipedia, a man named Narayana Pandita presented the fo ...
- [题解]UVA11027 Palindromic Permutation
链接:http://vjudge.net/problem/viewProblem.action?id=19602 描述:给出一个字符串,求重新排列后第n个回文串,若没有则输出"XXX&quo ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- 【leetcode刷题笔记】Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- 算法与数据结构基础 - 数组(Array)
数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- Codeforces 750E New Year and Old Subsequence 线段树 + dp (看题解)
New Year and Old Subsequence 第一感觉是离线之后分治求dp, 但是感觉如果要把左边的dp值和右边的dp值合起来, 感觉很麻烦而且时间复杂度不怎么对.. 然后就gun取看题解 ...
随机推荐
- rbenv:Ruby 多版本管理利器
在 Ruby 开发的世界中,经常需要面对不同项目使用不同 Ruby 版本的情况.这时,一个高效.灵活且易于使用的 Ruby 版本管理工具就显得尤为重要. rbenv 正是这样一个工具,它允许开发者在同 ...
- rocketmq 搭建配置
broker组1: # NameServer地址 namesrvAddr=192.168.1.100: 9876;192.168.1.101: 9876 # 集群名称 brokerClusterNam ...
- django中实现Markdown
分为两个部分: ------------后台使用Markdown编辑 ------------前端使用Markdown展示 准备工作: pip install django-mdeditor # 用于 ...
- Python爬图片(面向对象版)
import requests from lxml import etree from threading import Thread class Spider(object): def __init ...
- nginx启动流程
nginx启动流程 1. 根据命令行决定配置文件路径 2. 如果处于升级中则监听环境变量里传递的监听句柄 3. 调用所有核心模块的create_conf方法生成存放配置项的结构体 4. 针对所有核心模 ...
- 《iOS面试之道》-“串行队列的代码实战” 勘误
一.原书第一版154页开始讲解串行队列.并发队列.以及在Dispatch_Async.Dispatch_Sync下面的作用 最后一段代码: if(_q == NULL) { _q = dispatch ...
- js 判断闰年
首先,我们需要了解闰年的判断方式 1.能被4整除 2.并且不能被100整除 3.或者被400整除的 其次我们再来回顾下函数封装的知识,所谓的函数封装就是将一段函数封装成一个工具,有人用到了拿过来就可以 ...
- SpringBoot系列(四)使用spring-kafka实现生产者消费者demo代码
一.引入spring-kafka的maven依赖 <dependency> <groupId>org.springframework.kafka</groupId> ...
- 贝壳找房: 为 AI 平台打造混合多云的存储加速底座
贝壳机器学习平台的计算资源,尤其是 GPU,主要依赖公有云服务,并分布在不同的地理区域.为了让存储可以灵活地跟随计算资源,存储系统需具备高度的灵活性,支持跨区域的数据访问和迁移,同时确保计算任务的连续 ...
- SDL3 入门(2):第一个窗口
在上一篇文章中我们已经利用 SDL 的日志接口实现了简单的字符串输出,实际上是解决了开发环境搭建问题,接下来我们将在已有代码的基础上继续开发,实现第一个窗口的创建和背景色绘制. 初始化 首先设置日志输 ...