【离散化+枚举】代码源每日一题div2 全部相等

全部相等 - 题目 - Daimayuan Online Judge

题意:

【离散化+枚举】代码源每日一题div2 全部相等_第1张图片

思路:

首先,子序列最长,想到了DP,但是子序列DP,D不出来,所以要放弃想法

不难发现,这道题和顺序没有关系,所以可以说,它不是严格意义上的“子序列”

因为每个元素的出现次数相同,因此我们可以去枚举每个元素的出现次数,然后算贡献

贡献就是次数*(出现次数大于这个次数的个数)

那么后者怎么算呢

可以考虑笨笨的线段树,但是事实上一个map的后缀和就能解决问题,这是很常见的trick

但是范围是1e9,怎么办呢?数列一共就不长,离散化一下即可

当值域太大时,考虑离散化

Code:

#include 

#define int long long

using namespace std;

using i64 = long long;

const int mxn=2e5+10;

map 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<=1;i--) mp3[i]+=mp3[i+1];
	int ans=0;
	for(int c=1;c<=N;c++){
		ans=max(ans,c*mp3[c]);
	}
	cout<>__;
    while(__--)solve();return 0;
}

你可能感兴趣的:(算法)