全部相等 - 题目 - Daimayuan Online Judge
题意:
思路:
首先,子序列最长,想到了DP,但是子序列DP,D不出来,所以要放弃想法
不难发现,这道题和顺序没有关系,所以可以说,它不是严格意义上的“子序列”
因为每个元素的出现次数相同,因此我们可以去枚举每个元素的出现次数,然后算贡献
贡献就是次数*(出现次数大于这个次数的个数)
那么后者怎么算呢
可以考虑笨笨的线段树,但是事实上一个map的后缀和就能解决问题,这是很常见的trick
但是范围是1e9,怎么办呢?数列一共就不长,离散化一下即可
当值域太大时,考虑离散化
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
using i64 = long long;
const int mxn=2e5+10;
map<int,int> mp,mp2;
int N,idx=0;
int a[mxn];
int mp3[mxn];
int S(int x){
if(mp2.count(x)) return mp2[x];
return mp2[x]=++idx;
}
void solve(){
cin>>N;
for(int i=1;i<=N;i++) cin>>a[i];
for(int i=1;i<=N;i++){
a[i]=S(a[i]);
mp[a[i]]++;
}
//for(int i=1;i<=N;i++) cout<<a[i]<<" \n"[i==N];
for(auto it:mp) mp3[it.second]++;
for(int i=N;i>=1;i--) mp3[i]+=mp3[i+1];
int ans=0;
for(int c=1;c<=N;c++){
ans=max(ans,c*mp3[c]);
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}