Codeforces Round #558 (Div. 2)-B2

地址:https://codeforces.com/contest/1163/problem/B2

思路:从4分钟过了A题,然后来做B题,结果TM题目理解错了,题目意思是前k个去掉某一个后剩余的各颜色个数必须相同,同样颜色可以不连续,我TM因为相同颜色必须连续,结果样例也解释的通。。。 然后就炸了,唉,又掉分(T_T)

还是比较麻烦的,可以遍历a[i]记录各颜色出现的次数 d[i] 以及出现的颜色种类数s,然后记录当前状态下各颜色要达到合法状态的最小出现次数l ,以及d[i]==l的次数sl, d[i]>l的次数sr, 以及d[i]==1的个数l1, 然后根据必须只能删一个来判断是否达到合法情况, 例如而当 sr>1 时,那么l+=1等等,以及特殊情况的处理

Code:

#include<iostream>
#include<cstring>
using namespace std;

const int MAX_M=1e5+5;
int n;
int d[MAX_M];

int main()
{
	ios::sync_with_stdio(false);
	while(cin>>n){
		memset(d,0,sizeof(d));
		int res=1,l=0,s=0,s1=0,sl=0,sr=0;
		for(int i=1,x;i<=n;++i)
		{
			cin>>x;
			++d[x];
			if(d[x]==1){
				++s;	++s1;
			}else	if(d[x]==2){
				--s1;
			}
			if(d[x]==l)	++sl;
			else	if(d[x]==l+1){
				--sl;
				if(sr){
					l+=1;
					sl=2;	sr=0;
				}else	sr=1;
			}else	if(d[x]>l+1){
				l=d[x]-1;
				sl=0;
				sr=1;
			}
			if(sl==s-1&&sr+s1==1){
				res=i;
			}
			if(s==2&&s1==1)	res=i;
			if(l==1)	res=i;
		}
		cout<<res<<endl;
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值