RE on #11莫队求调
查看原帖
RE on #11莫队求调
730828
UMS2楼主2024/8/2 22:17

rt,已经开两倍空间了还是段错误。R170196772

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=4e5+5;
int n,m,blo,res;
int ori[N],bel[N],ans[N],bkt[N],tot[N];

struct Ques{
	int l,r,id;
	
	bool operator <(const Ques x)const{
		if(bel[l]^bel[x.l])return bel[l]<bel[x.l];
		return (bel[l]&1)^(r>x.r);
	}
}q[N];

void add(int x){
	tot[bkt[ori[x]]]--;
	tot[++bkt[ori[x]]]++;
	res=max(res,bkt[ori[x]]);
}

void del(int x){
	tot[bkt[ori[x]]]--;
	if(!tot[bkt[ori[x]]]&&bkt[ori[x]]==res)res--;
	tot[--bkt[ori[x]]]++;
}

signed main(){
	ios::sync_with_stdio(0);
	bel[0]=1;
	cin>>n>>m;
	blo=n/sqrt(m);
	blo=max(blo,1ll);
	for(int i=1;i<=n;i++){
		cin>>ori[i];
		ori[i]+=2e5;
		bel[i]=(i-1)/blo+1;
	}
	
	for(int i=1,l,r;i<=m;i++){
		cin>>l>>r;
		q[i]=(Ques){l,r,i};
	}
	sort(q+1,q+m+1);
	
	for(int i=1,l=1,r=0,nl,nr;i<=m;i++){
		nl=q[i].l,nr=q[i].r;
		while(l>nl)add(--l);
		while(r<nr)add(++r);
		while(l<nl)del(l++);
		while(r>nr)del(r--);
		ans[q[i].id]=res;
	}
	for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';
	return 0;
}
2024/8/2 22:17
加载中...