版权属于舒老师,想要引用此题(包括题面)的朋友请联系博主


分析:
mmp,这道题做了不短的时间(这是什么语法。。。)

首先我们可以用O(nlogn)O(nlogn)O(nlogn)的复杂度计算出f[i]f[i]f[i](表示以iii为结尾的LIS)


以下就是我yy的过程了:

一开始有一个非常naive的想法:
把数组的每个位置视为一个点
每个点向在ta后面且比ta大的点连一条边
那么对于询问我们只需要在图中找到一条长度为Q的路径即可
(至于字典序最小,我们直接贪心构造即可)

但是这样边数会比较多,我们深入考虑能成为每个点后继的条件:
看一个简单的例子

    1   2   3   4   5
a=  2   5   6   4   3 

对于a[1]" role="presentation" style="position: relative;">a[1]a[1]a[1],我们显然需要向a[2]a[2]a[2]连边,但是我们没有必要向a[3]a[3]a[3]连边
然而我们还是需要向a[4],a[5]a[4],a[5]a[4],a[5]连边

一句话总结:从前往后扫,记minnminnminn为当前扫到的数字的最小值,我们只需要向小于minnminnminn且大于a[i]a[i]a[i]的元素连边即可
(也就是说,数值较大还靠后的元素就没有必要连边了

这样我们就可以得到每个结点的后继结点
贪心的,后继结点按照数值从小到大排序,这样我们遍历的时候就可以直接贪心构造解了

至此为止,如果我们要处理询问就需要遍历整个图
虽然边数已经减少了很多,但是还是达不到要求

所以我用O(n2)O(n2)O(n^2)的时间处理出了len[i]len[i]len[i],表示以位置iii为起点的LIS" role="presentation" style="position: relative;">LISLISLIS

这样在构造解的时候,我们找到len[i]>=Qlen[i]>=Qlen[i]>=Q且a[i]a[i]a[i]最小的元素作为起点
之后贪心构造答案即可:遍历后继结点,只有后继结点的“len+当前答案长度>=Q”“len+当前答案长度>=Q”“len+当前答案长度>=Q”,我们才继续往下走

复杂度O(nq)O(nq)O(nq)
(预处理不算啦)


可能有dalao会吐槽:
O(n2)O(n2)O(n^2)处理出lenlenlen数组,不是太慢了吗

啊咧,确实。。。
不过这道题的标算是O(nq)O(nq)O(nq)的(所以胖爷用O(nqlogn)O(nqlogn)O(nqlogn)艹掉了标算。。。)

科学的预处理:

把整个序列翻转过来,求以每个结点为末尾的最长下降子序列
这样正过来就是以每个结点为起点的LISLISLIS

实际上这道题的标解贪心贪的更漂亮

从前往后,找到len>=Qlen>=Qlen>=Q且数值最小的位置iii,作为答案的起点
之后的每一位一定在i" role="presentation" style="position: relative;">iii之后,
我们在iii之后找到len+当前答案长度&gt;=Q" role="presentation" style="position: relative;">len+当前答案长度>=Qlen+当前答案长度>=Qlen+当前答案长度>=Q且数值最小的位置jj<script type="math/tex" id="MathJax-Element-57">j</script>,作为答案的第二位
以此类推即可

tip

贴出我在考场上写的丑陋代码(毕竟也是想了好久的)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;const int N=10002;
int n,g[N],maxlen,m,V[N],a[N],pos[N],nn,len[N];
int G[N][1002],size[N];
int X;void LIS() {g[1]=a[1];maxlen=1;for (int i=2;i<=n;i++) {if (a[i]>g[maxlen]) {g[++maxlen]=a[i];continue;}int r=lower_bound(g+1,g+1+maxlen,a[i])-g;g[r]=a[i];}
}int cmp(const int &A,const int &B) {return a[A]<a[B];                      //按值排序
}void prepare() {for (int i=1;i<=n;i++) size[i]=0;for (int i=n;i>=1;i--) {len[i]=1;int minn=n+1;                      //值大还靠后的就不用连边了 for (int j=i+1;j<=n;j++) if (a[j]<minn&&a[j]>a[i]) {G[i][++size[i]]=j;         //G[i] 位置i的后继 minn=a[j];len[i]=max(len[i],len[j]+1);//len[i] 以i为起点的LIS }}for (int i=1;i<n;i++) sort(G[i]+1,G[i]+1+size[i],cmp);
}int ans[N];
bool flag;void dfs(int t,int s) {if (t>=X) {flag=0;return;}if (!flag) return;for (int i=1;i<=size[s];i++)if (len[G[s][i]]+t>=X&&flag) {printf("%d ",V[a[G[s][i]]]);dfs(t+1,G[s][i]);if (!flag) return;}if (!flag) return;
}void solve() {flag=1;for (int i=1;i<=nn-X+1;i++)if (len[pos[i]]>=X&&flag) {printf("%d ",V[a[pos[i]]]);dfs(1,pos[i]);printf("\n");break;  }
}int main() {freopen("misswalmart.in","r",stdin);freopen("misswalmart.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]),V[i]=a[i];                     //V[i]  记录i的原始值 sort(V+1,V+1+n);nn=unique(V+1,V+1+n)-V-1;for (int i=1;i<=n;i++) {a[i]=lower_bound(V+1,V+1+nn,a[i])-V;             //离散化 pos[a[i]]=(pos[a[i]]==0)? i:min(pos[a[i]],i);    //值最靠前的位置 }LIS();prepare();scanf("%d",&m);for (int i=1;i<=m;i++) {scanf("%d",&X);if (X>maxlen) {printf("LXALWAYSMISS\n");continue;}solve();}return 0;
}

舒老师AK的hu测 T1. 迷失沃尔玛(dp+贪心)相关推荐

  1. 舒老师AK的hu测 T2. LX还在迷路(线段树+等差数列)

    版权属于舒老师,想要引用此题(包括题面)的朋友请联系博主 分析: 这道题是舒老师的原创题(版权声明~) 神题啊,毒瘤题啊 正解 首先,我们可以先忽略n(n+1)2n(n+1)2n(n+1) \over ...

  2. 【学术篇】规律选手再次证明自己(舒老师的胡策题 T2 LX还在迷路)

    只要你不强制在线, 我就能分块. --Reflash 就算你强制在线, 我还是要分块. --Enzymii 今天做了一波舒老师的毒瘤题, T1据说很水但是没思路所以直接放掉了.. 去看了看T2好像可以 ...

  3. 校内hu测(10.6T2,T3)(乱搞+贪心+模拟)

    @liu_runda T2.便(then) [题目描述] 给出一个R*C的棋盘.共有R行C列,R*C个格子.现要在每个格子都填一个非负整数.使得任意一个2*2的正方形区域都满足这样的性质:左上角的数字 ...

  4. c语言体能测试模块,体测来啦,送你一份通关礼包(附老师建议及体测技巧)...

    一年一度的大型运动现场又"不期而至"啦 本来岭南君还在等待着秋天的到来 然而 一不小心却等来了体测! 真是让人"又爱又恨" 惆怅之余,岭南君还是凭着一百二十分的 ...

  5. Nginx安装手册(摘自入云龙老师教案,亲测可用)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Nginx安装手册 一. nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程 ...

  6. 初十hu测 T3.deep(点分治)

    分析: 部分分写一个链剖 线段树中维护信息: sumsumsum:区间和("("赋值为1,")"赋值为-1) lmxlmxlmx:从左端开始的区间最大值 rmx ...

  7. 曲神的hu测 T2.Van(左偏树+dp)T3.Gay

    版权属于yhzq,想要引用此题(包括题面)的朋友请联系博主 T2.Van 分析: 这样把博弈黑出翔真的好吗... 首先我们要明确怎么计算一个序列的最长Van序列 这就和花匠那道题有异曲同工之妙了 我们 ...

  8. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  9. Loi 模拟赛之压轴出场的互测终曲|(*_-) 模拟+模拟+贪心+bfs+图论+数论

    这份题内容比较基础,但是质量很高: 然而我还是GG了: T1: Problem 1 :令咒(order.cpp) 题目描述 当你终于打通 Codevs 钻石天梯, 成为一名 Master 后.在 11 ...

最新文章

  1. MySQL高级 - insert优化
  2. 命名时取代基优先顺序_【选修五】高中化学重难点知识:有机物的命名方法
  3. robcad和catia是什么关系_proe/CATIA/UG/SolidWorks软件区别与联系
  4. day27 粘包及粘包的解决方案
  5. idea搭建springcloud项目_Eureka搭建分布式SpringCloud项目
  6. Gradle 命令之 --stacktrace , --info , --debug 用法
  7. 人脸识别常用开源数据集大全
  8. matlab小波分析工具箱,matlab小波分析工具箱
  9. win11右键菜单缺少“新建“选项解决办法
  10. 第七章 逻辑回归 - 多元逻辑回归
  11. Kinect的Kinect Manager脚本简介
  12. 新浪短链接:15款最佳t.cn短网址在线生成工具
  13. GET获取表单数据的方法
  14. Jsp中的forward 和 redirect
  15. 快的买大黄蜂是福是祸?
  16. k-means 的原理,优缺点以及改进
  17. CSDN 博客积分规则
  18. ERP 基础数据 概念
  19. php wap 2.0,WAP2.0网站分类及其架构浅析
  20. 相机光学(零)——分辨率测试

热门文章

  1. fastadmin 阿里云oss解决访问图片是下载
  2. 蓝桥杯——PWM / PWM定时器捕获频率和占空比
  3. 计算机rom和硬盘,都是存储器,但RAM、ROM、闪存、硬盘怎么分?
  4. Firefox for Mac(火狐浏览器 mac)一款速度快到飞起的浏览器
  5. XXL-JOB(2)-使用
  6. 获取手机指纹库指纹信息
  7. fNIRS功能近红外数据处理服务
  8. JAVAWEB常用测试浏览器
  9. 【牛客网笔试】:Python实现:将i am a student转换成 student. a am i
  10. gps测试软件怎么算正常,完整的GPS测试和经济实用的解决方案