纯思维题目
还是很好想的:假设我现在知道了前 i - 1 张的答案,然后我需要求前 i 张牌的答案(为什么是这样想?,因为题目就是这么说的:依次回答的每一个答案
那么当我新加入a[i]时,如果前 i  - 1张牌里面有 a[i] - 1 或者有 a[i] + 1牌时,那么我是不是就可以连成顺子来打?
可以将a[i]与a[i] - 1或者a[i] 与 a[i] + 1连接成顺子,这样前 i 张牌的答案就是前 i - 1张牌的答案,但是:
比如[4, 5, 4],答案是[1, 1, ?]此时 "?"就不是1而是2,所以这里面还得考虑一个关键因素:数量
那么结论就是:(用vis[x]表示x的数量)
设ans[i - 1]表示前 i - 1 张牌的答案, a[i] = x
情况一:如果vis[x - 1] > vis[x] && vis[x] < vis[x + 1], 那么x就不仅可以与x - 1连接成顺子也可以和 x + 1连接成顺子
            比如[5, 7, 6],那么我加入6时,此时6既可以和5连成顺子也可以和7连成顺子,那么ans[3] = ans[2] - 1
情况二:如果vis[x - 1] > vis[x] || vis[x] < vis[x + 1],那么x不能和两边连成顺子,只能连接一边成为顺子,所以ans[i] = ans[i - 1]
情况三:除了以上两种情况,那么就只有最后一种情况了:就是vis[x - 1] >= vis[x] && vis[x] <= vis[x + 1],那么此时x不能连成顺子,那么就只能单开一个,所以ans[i] = ans[i - 1] + 1
总代码:
now 模拟需要操作的次数
vis(n + 2),如果a[i] = n, 那么vis[a[i] + 1] = vis[n + 1]
每次循环结束后需要vis[x] ++
#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long

signed main(){
    ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    
    int n; cin >> n;
    vector<int> a(n + 1), vis(n + 2), ans(n + 1);
    for(int i = 1; i <= n; i ++) cin >> a[i];
    int now = 0;
    for(int i = 1; i <= n; i ++){
        int x = a[i];
        if(vis[x - 1] > vis[x] && vis[x] < vis[x + 1]) now --;
        else if(vis[x - 1] > vis[x] || vis[x] < vis[x + 1]) now = now;
        else now ++;
        ans[i] = now;
        vis[x] ++;
    }
    for(int i = 1; i <= n; i ++) cout << ans[i] << " ";
    cout << endl;
    return 0;
}