题目链接:
https://cn.vjudge.net/problem/CodeForces-977F
1 /* 2 问题 3 输入n和n个数的数列 4 计算并输出最长增量为1的上升子序列 5 6 解题思路 7 用n2的最长上升子序列求解是不可行的,应为n的规模是(1≤n≤2*10^5),所以想到只能用一重循环的算法, 8 于是使用map标记,如果将当前的数的长度赋值为比它小1的长度加1,可以的到最长的序列,最后找到最长序列记录编号 9 依次输出即可。 10 */ 11 #include<cstdio> 12 #include<iostream> 13 #include<map> 14 #include<vector> 15 using namespace std; 16 17 map<int,int> mp; 18 int a[205000]; 19 int main() 20 { 21 int n,i; 22 int maxk,maxp; 23 vector<int> v; 24 while(scanf("%d",&n) != EOF){ 25 mp.clear(); 26 maxk=-1; 27 for(i=1;i<=n;i++){ 28 scanf("%d",&a[i]); 29 mp[a[i]]=mp[a[i]-1]+1; 30 31 if(maxk < mp[a[i]]){ 32 maxk = mp[a[i]]; 33 maxp=i; 34 } 35 } 36 37 v.clear(); 38 int st=a[maxp]-maxk+1; 39 for(i=1;i<=n;i++){ 40 if(a[i] == st){ 41 v.push_back(i); 42 st++; 43 } 44 if(st == a[maxp]+1) 45 break; 46 } 47 48 printf("%d ",maxk); 49 for(i=0;i<v.size()-1;i++){ 50 cout<<v[i]<<" "; 51 } 52 cout<<v[v.size()-1]<<endl; 53 } 54 return 0; 55 }