地址: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;
}