1. 程式人生 > >Codeforces Round #558 (Div. 2)B(SET,模擬)

Codeforces Round #558 (Div. 2)B(SET,模擬)

++i div || ros else if codeforce def 個數 i++

#include<bits/stdc++.h>
using namespace std;
int a[100007];
int cnt[100007];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int ans=1;
set<int>s,num;//數字出現的次數,數字
map<int,int>vis;//記錄數字出現的次數的個數
cnt[a[1]]++;
s.insert(cnt[a[1]]);
num.insert(a[1]);
vis[cnt[a[1]]]++;

for(int i=2;i<=n;++i){
vis[cnt[a[i]]]--;
if(!vis[cnt[a[i]]])
s.erase(s.find(cnt[a[i]]));
cnt[a[i]]++;
vis[cnt[a[i]]]++;
s.insert(cnt[a[i]]);
num.insert(a[i]);
if(s.size()==2){
if(*s.rbegin()-*s.begin()==1&&vis[*s.rbegin()]==1||*s.begin()==1&&vis[1]==1)//有一個數字多出現了一次或者有一個數字只出現了一次
ans=i;
}
else if(s.size()==1&&(num.size()==1||*s.begin()==1))//只有一個數字或者都只出現了一次
ans=i;
}
printf("%d",ans);
return 0;
}

Codeforces Round #558 (Div. 2)B(SET,模擬)