首页 > 其他分享 >P2215 [HAOI2007] 上升序列题解

P2215 [HAOI2007] 上升序列题解

时间:2024-05-30 21:36:22浏览次数:25  
标签:int 题解 Omicron HAOI2007 maxn P2215 序列 include 复杂度

题目大意

对于一个集合 $ S $,对于 $ S $ 中长度为 $ m $ 的子序列 $ P $,在集合 $ P $ 中如果 $ P_1<P_2<...<P_m $ 那么我们称 $ P $ 为 $ S $ 的一个上升序列。如果有多个 $ P $ 满足条件我们就输出最小的那个,如果没有完成条件的 $ P $ 则输出 Impossible

思路

对于一个含有 $ n $ 个元素的集合,我们求出这个集合每一个最长上升序列总时间复杂度需要 $ \Omicron(n^2) $ 看一眼数据 $ 10^4 $ 完全可以,接着对于每一个输入的 $ len $,我们直接从第一个开始暴力判断,在每次判断时维护一下当前的数,每一次最坏的时间复杂度为 $ \Omicron(n) $ 所以总时间复杂度为 $ \Omicron(m \times n ) $,由此可以算出我们完成这道题最坏的时间复杂度为 $ \Omicron(n^2 + m \times n) $ 及 $ \Omicron(1.1 \times 10^8) $ 而一秒大约能运行 $ 3 \times 10^8 $ 次,所以这道题暴力完全能过。

Code:

#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#define sc(ppt) scanf("%d" , &ppt)
#define ll long long
#define prt printf
using namespace std;

const int maxn = 1e4 +  1;
int n , m , f[maxn] , a[maxn] ; 

signed main(){
	sc(n) ;
	for(int i=1 ; i<=n ; i++) sc(a[i]) ;
	for(int i=1 ; i<=n ; i++) f[i] = 1;
	for(int i=n ; i>=1 ; i--){
		for(int j=n ; j>=1 ; j--){
			if(a[j] > a[i]) f[i] = max(f[i] , f[j] + 1); // 暴力求最长子序列 
		}
	}
	sc(m) ;
	while(m --){
		int len , cnt = 0 , j = 0 , ans[maxn]; sc(len) ;
		for(int i=0 ; i<=n&&len ; i=j , len--){ // 维护序列长度 
			for(j=i+1 ; j<=n ; j++){
				if(f[j] >= len && a[j] > a[i]) break; // 用当前最长上升的子序列来判断 
			}
			if(j <= n) ans[++ cnt] = a[j]; // 维护当前这个数的状态 
			else break;
		}
		if(len != 0) prt("Impossible\n"); // 如果还需要的数的个数不为0那么说明上升子序列长度不够 
		else{
			for(int i=1 ; i<=cnt ; i++) prt("%d " , ans[i]);
			prt("\n");
		}
	}
	return 0;
}

标签:int,题解,Omicron,HAOI2007,maxn,P2215,序列,include,复杂度
From: https://www.cnblogs.com/CaoSheng-blog/p/18223260

相关文章

  • P2266 爱的供养题解
    题目大意给你一个矩阵$w$,大小为$n\timesm$,然后你每次都从一个宝藏点开始去走旁边$T-1$个点施法,施法过的点就不用再走了,施法不需要耗费体力但是每一次从一个点走到另一个点需要耗费的权值为这两个点的高度差,你每次可以走的方向是上下左右。求最小需要耗费的体力。......
  • P10526 [XJTUPC2024] 命令行题解
    题目大意对于一个字符串$s$在输入的最后一行读入的字符,如个字符不为$E\(,\)T\(,\)B$那么这一个字符就添加至字符串$s$的末尾。对于操作$B$那么执行删除字符串$s$的最后一个字符,如果$s$为空那么跳过这个操作。对于操作$T$找到一个以字符串......
  • P10530 [XJTUPC2024] 生命游戏 题解
    题目大意一棵树一共$n$个点如果有$k$个点与某一个点相连那么这一轮的结尾这个点就会死。思路这道题有几个坑!并没有说哪一个节点是根节点。双向边记得开双倍数组。等这一轮的点消除完了才能再次判断哪一些点可以消除。首先我们创建一个数组$Size_{n}$来......
  • CF/505/D 题解
    思路这道题的思路其实是根据样例图片来的。首先第一张:这张图片可以得知$n$个点没有环的时候最少需要$n-1$个点。再看第二张:这个图确实很难思考,但稍微思考一下如果我们把含有一个强连通分量的图变成一整个强连通图。这个图的边数不就变成$n$了吗?来推一下......
  • P6342 [CCO2017] Vera 与道路建设 题解
    题目大意对于一个图w一共有v个点点的编号为1,2,...,v,对于点a与点b如果满足$a\tob$且$b\toa$使得每一条道路都只走过一次,那么我们称$a,b$为完美点对,当一个联通图只有$k$个完美点对时,称这个联通图为美丽公路网,要求求出一个美丽公路网......
  • Nikita and LCM题解
    题目大意给你一个数组$a$,令$t$为$a$的子序列且$t$中所有数的最小公倍数$\notina$求$t$数组中最多有多少个数。思路非常明显这是一道数学题,对于数组$a$我们首先从小到大拍一个序,然后我们可以求出$a$中所有数的最大公倍数,如果这个公倍数$\not=......
  • MITIT 2024 Spring Invitational Qualification 简要题解
    这个比赛没有找到题解,有点难绷,所以来写篇。(实际上是无聊时写的就是了)题面:https://codeforces.com/gym/105125/。目测难度是绿绿黄紫紫。A有点诈骗。其实策略是只保留\(\le3\)个数,然后就随便维护一下。\(O(n\logn)\)。Code#include<bits/stdc++.h>usingnamespaces......
  • Gym-100520A Andrew Stankevich Contest 45 A 题解
    AnalogousSetsGym-100520ASol1.集合生成函数将可重集合\(M\)映射为生成函数:\[F(M)=\sum_{m\inM}(\#m)\cdotx^m\]如果\(M\)的元素在\(\mathbbN\)上取值,那么,\(F(M)\)是多项式。2.\(\theta\)算子\[\theta(F)=x\cdotF'\]其中\(F'=\frac{dF}{dx}\)......
  • Springboot报class path resource [xxxxx.json] cannot be resolved to URL because i
    当Springboot解析resources文件下的json文件时,在本地环境好用,部署到服务器上找不到文件内容报错classpathresource[xxxxx.json]cannotberesolvedtoURLbecauseitdosenotexist问题排查(1)pom.xml文件配置<build><resources><resource><d......
  • 洛谷 P8725 [蓝桥杯 2020 省 AB3] 画中漂流 的题解
    题目大意传送门思路考虑使用时空复杂度为O(tm)O(tm)......