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 }

 

上一篇:《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第四章 变换 Transforms


下一篇:docker