解题思路
设 分别为点数 的末次出现位置和出现次数,约定 。
任意以 开局,处理至 时桌面均仅剩 ,故最终序列为 接上后缀 的最终序列。连边:
沿边 严格递增,形成以 为根的树。每局最终牌值恰为 到根路径上的非 结点,故答案是以 为权的子树和。按 递增向父亲累加即可,时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N=500005;
int a[N],last[N],ans[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
last[a[i]]=i;
ans[a[i]]++;
}
for(int i=1;i<=n;i++)if(last[a[i]]==i)ans[a[i+1]]+=ans[a[i]];
for(int i=1;i<=m;i++)cout<<ans[i]<<' ';
return 0;
}