Codeforces Round #558 (Div. 2) B2. Cat Party (Hard Edition)(思维题)

题目

有n(1<=n<=1e5)个数,第i个数为ui(1<=ui<=1e5)

对于其前缀i个数,必须删去一个数,使得对于剩下的数中,每种数字出现的次数相同

最大化符合条件的i,输出这个i

思路来源

官方题解

题解

记cnt[x]为出现次数为x的有几种数字,num[v]为数v出现的次数

只有以下四种情况符合条件,

①前i个数为同一种数

②前i个数为i种数,即每种出现了1次

③前i个数,其余种出现次数相等,此外仅有一种只出现了一次

④前i个数,其余种出现次数相等,此外仅有一种比其余种多一次

代码

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define sci(n) scanf("%d",&(n));
using namespace std;
const int N=1e5+10;
int n,cnt[N],num[N],v;

int mx,ans;
bool ok;
int main()
{
	sci(n);
	rep(i,1,n)
	{
		sci(v);
		cnt[num[v]]--;
		num[v]++;
		cnt[num[v]]++;
		mx=max(mx,num[v]);
		ok=0;
		if(cnt[1]==i)ok=1;
		if(mx==i)ok=1;
		if(cnt[1]==1&&cnt[mx]*mx==i-1)ok=1;
		if(cnt[mx]==1&&cnt[mx-1]*(mx-1)==i-mx)ok=1;
		if(ok)ans=i;
	}
	printf("%d\n",ans);
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code92007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值