求问莫队
  • 板块学术版
  • 楼主fighterkong
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/1/28 21:58
  • 上次更新2023/10/28 10:28:00
查看原帖
求问莫队
547618
fighterkong楼主2022/1/28 21:58
#include <bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,k=1;
	char ch=getchar();
	while (ch>'9'||ch<'0'){if(ch=='-')k=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*k;
}
struct node
{
	int l,r,p;
}e[200005];
int a[100005],ans[200005],temp,app[200005],num[200005],ti[200005],siz;
inline bool cmp(node s,node s1)
{
	if(s.l/siz!=s1.l/siz)return s.l<s1.l;
	if((s.l/siz)&1)return s.r<s1.r;
	return s.r>s1.r;
}
inline void add(int x)
{
	--ti[app[a[x]]];
	++app[a[x]];
	++ti[app[a[x]]];
	if(app[a[x]]>temp)temp=app[a[x]];
}
inline void del(int x)
{
	--ti[app[a[x]]];
	--app[a[x]];
	++ti[app[a[x]]];
	if(!ti[app[a[x]]+1]&&temp-1==app[a[x]])--temp;
}
int main()
{
	int n=read(),Q=read();
	siz=sqrt(n);
	for(int i=1;i<=n;++i)num[i]=a[i]=read();
	int tot=unique(num+1,num+n+1)-num-1;
	for(int i=1;i<=n;++i)a[i]=lower_bound(num+1,num+tot+1,a[i])-num;
	for(int i=1;i<=Q;++i){e[i].l=read();e[i].r=read();e[i].p=i;}
	sort(e+1,e+Q+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=Q;++i)
	{
		int L=e[i].l,R=e[i].r;
		while(l<L)del(l++);
		while(l>L)add(--l);
		while(r<R)add(++r);
		while(r>R)del(r--);
		ans[e[i].p]=temp;
	}
	for(int i=1;i<=Q;++i)printf("%d\n",ans[i]);
	return 0;
}

为啥会RE(P1997)

2022/1/28 21:58
加载中...