B2. Cat Party (Hard Edition)
题目链接:
https://codeforces.com/problemset/problem/1163/B2
题目大意:
有n个点,然后每个点都有一个颜色,然后找到一个最大的坐标,能够满足:从1 ~ i 这个位置,我们可以任意删除一个人,使得剩下的所有的颜色出现次数都相等。
具体思路:
SB模拟题给打残了。。。
满足题目条件的有如下四种情况:
1,都只出现过一次
2,从1~i都是相同的数
3,出现了一次的有一个,剩下的出现次数都相同。
4,当前局势 有出现不同次数的有两种情况,比如果 出现了a次的和出现了b次的,因为我们要删除一个人,所以一定是删除出现次数多的那个(删除出现少的时候,只有次数为1的时候满足,次数为1的已经判断好了)。所以我们判断当前出现次数多的-1 去乘以当前次数减去1的个数是不是等于 i - 出现次数最多的个数 就好了。
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 # define ll long long
4 const int maxn = 2e5+100;
5 map<int,int>cnt;
6 map<int,int>sum;
7 int main(){
8 int n,tmp;
9 scanf("%d",&n);
10 int maxx=0,ans=0;
11 for(int i=1;i<=n;i++){
12 scanf("%d",&tmp);
13 cnt[tmp]++;
14 sum[cnt[tmp]-1]--;
15 sum[cnt[tmp]]++;
16 maxx=max(maxx,cnt[tmp]);
17 if(i==sum[1]){ans=max(ans,i);}
18 if(sum[i]==1){ans=max(ans,i);}
19 if(sum[1]==1&&maxx*sum[maxx] == i - 1){ans=max(ans,i);}
20 if(sum[maxx] == 1 && ( sum[maxx-1]*(maxx-1)== i - maxx ) ){ans=max(ans,i);}
21 }
22 printf("%d\n",ans);
23 return 0;
24 }