关于add和del的压行卡常
查看原帖
关于add和del的压行卡常
538609
Neutralized楼主2021/11/27 09:28

adddel函数本来长这样:

//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验证码好离谱啊

2021/11/27 09:28
加载中...