add和del函数本来长这样:
inline void add(int x)
{
num[cnt[a[x]]]--;
num[++cnt[a[x]]]++;
temp=max(temp,cnt[a[x]]);
}
inline void del(int x)
{
num[cnt[a[x]]]--;
if(cnt[a[x]]==temp&&!num[cnt[a[x]]])
temp--;
num[--cnt[a[x]]]++;
}
然后我思索了一下决定像某篇blog里讲的那样压行试试
于是
lef=qr[i].l,rig=qr[i].r;
while(cl<lef)
temp-=((cnt[a[cl]]==temp)&(!(--num[cnt[a[cl]]]))),num[--cnt[a[cl++]]]++;
while(cl>lef)
num[cnt[--cl]]--,num[++cnt[a[cl]]]++,temp=max(temp,cnt[a[cl]]);
while(cr<rig)
num[cnt[++cr]]--,num[++cnt[a[cr]]]++,temp=max(temp,cnt[a[cr]]);
while(cr>rig)
temp-=((cnt[a[cr]]==temp)&(!(--num[cnt[a[cr]]]))),num[--cnt[a[cr--]]]++;
果断地10pts去世
Ball 大佬讲解这样写错在哪里()
jbw8验证码好离谱啊