F. Consecutive Subsequence 小思路dp

mac2026-09-27  10

题目传送门--->F. Consecutive Subsequence

题意:寻找最长连续递增子序列,得连续并且得递增。

题解:用map记录每一个出现过的数字的最长值即可。注意就是这题要是用unorder_map的话就会超时,但是只用map就不会,大概是因为虽然map还多了排序时间,但是unorder_map内部是用哈希表的,建立哈希表很耗时间,估计就是这个点使得unprder_map会超时。

#include <iostream> #include <algorithm> #include <cstdio> #include <map> #include <unordered_map> using namespace std; map<int, int>m; int a[200000+20], b[200000+20]; int main(){ int n; scanf("%d",&n); int mx=0, id; for(int i=1; i<=n; i++){ scanf("%d",&a[i]); m[a[i]] = m[a[i]-1]+1; if(mx<m[a[i]]) { mx=m[a[i]]; id=i; } } printf("%d\n",mx); int mi=a[id], cnt=0; for(int i=id-1; i>=1; i--){ if(a[i]==mi-1){ b[++cnt]=i; mi--; } } for(int i=cnt; i>=1; i--) printf("%d ",b[i]); printf("%d\n",id); return 0; }

 

最新回复(0)