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

 

 

 给出 n 个数,找出一个最大的 x,使得前 x 个数中任意删除一个数之后,其余数字的出现个数相同

可以利用两个数组,f 数组表示 a[i] 的出现次数,F 数组表示 a[i] 的出现次数的出现次数

  • 如果 \small f[a[i]]*F[f[a[i]]]=i,说明在添加一个数即可成立
  • 如果 \small f[a[i]]*F[f[a[i]]]=i-1,说明在 i 位置成立
const int N=2e5+5;

    int n,m;
    int i,j,k;
    int a[N];
    map<int,int> f,F;
    
int main()
{
    while(~sd(n)){
        int ans=1;
        F.clear(); f.clear();
        forn(i,1,n){
            sd(a[i]);
            f[a[i]]++;
            int x=f[a[i]];
            F[x]++;
            int y=F[x];
            if(x*y==i && i!=n) ans=i+1;
            if(x*y==i-1) ans=i;
        }
        pd(ans);
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页