add
和del
函数本来长这样:
//num[k]为出现了k次的数的个数
//cnt[i]为数i的出现次数
//temp为当前答案
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)// del(cl++);
temp-=((cnt[a[cl]]==temp)&(!(--num[cnt[a[cl]]]))),num[--cnt[a[cl++]]]++;
while(cl>lef)// add(--cl);
num[cnt[--cl]]--,num[++cnt[a[cl]]]++,temp=max(temp,cnt[a[cl]]);
while(cr<rig)//add(++cr);
num[cnt[++cr]]--,num[++cnt[a[cr]]]++,temp=max(temp,cnt[a[cr]]);
while(cr>rig)// del(cr--);
temp-=((cnt[a[cr]]==temp)&(!(--num[cnt[a[cr]]]))),num[--cnt[a[cr--]]]++;
果断地10pts去世
Ball 大佬讲解这样写错在哪里()
jbw8
验证码好离谱啊