题目链接:Problem - 977F - Codeforces
https://codeforces.com/problemset/problem/977/F
题目大意:
让我们找连续递增,差值为一的子序列,问最长子序列怎么取。
思路:
每次读入时,看前面有没有读入数-1的值,有的话,把数字拼接到子序列中。
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define endl "\n" const ll N = 2e5+7; ll n; ll v[N]; map<ll,ll>mp;//记录每个数的最大子序列 void solve(){ ll mx=0,ans=0,cnt=0; cin >> n; for(ll i = 1 ; i <= n ; i ++){ cin >> v[i]; cnt = mp[v[i]] = mp[v[i]-1] + 1;//把v[i]拼接到v[i-1]的子序列中 if(cnt > mx)mx = cnt ,ans = v[i];//记录最长子序列多长,结束是谁 } cout << mx << endl; cnt = ans-mx+1; for(ll i = 1 ; i <= n ; i ++) if(v[i] == cnt)cout << i << " ",cnt++; return; } int main(){ ll t=1;//cin >> t; while(t --)solve(); return 0; }