萌新刚写莫队一普朗克时间,求调
查看原帖
萌新刚写莫队一普朗克时间,求调
369041
bdfs_then_csdn楼主2023/5/24 18:09

大概只过了样例……然而水平太差造不出hack

求的是区间众数出现次数

#include<bits/stdc++.h>
using namespace std;
struct sss{int l,r,k,id;bool operator <(const sss &x){if(k==x.k)return r<x.r;return k<x.k;}}b[1000001];
int n,m,t[1000001],cnt[1000001],c[1000001],l=1,r=0,maxn,ans[1000001];
struct s{int num,id;bool operator <(const s &x){return num<x.num;}}a[1000001];
int main(){
	cin>>n>>m;int q=n/sqrt(m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i].num),a[i].id=i;
	sort(a+1,a+n+1);for(int i=1,j=0;i<=n;i++){if(a[i].num!=a[i-1].num)j++;c[a[i].id]=j;}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&b[i].l,&b[i].r);
		b[i].k=(b[i].l-1)/q+1;b[i].id=i;
	}sort(b+1,b+m+1);
	for(int i=1;i<=m;i++){
		while(l>b[i].l)l--,cnt[++t[c[l]]]++,cnt[t[c[l]]-1]--,maxn=max(maxn,t[c[l]]);
		while(r<b[i].r)r++,cnt[++t[c[r]]]++,cnt[t[c[r]]-1]--,maxn=max(maxn,t[c[r]]);
		while(l<b[i].l)cnt[--t[c[l]]]++,cnt[t[c[l]]+1]--,maxn=cnt[t[c[l]]+1]?maxn:maxn-1,l++;
		while(r>b[i].r)cnt[--t[c[r]]]++,cnt[t[c[r]]+1]--,maxn=cnt[t[c[r]]+1]?maxn:maxn-1,r--;
		ans[b[i].id]=cnt[maxn];
	}
	for(int i=1;i<=m;i++)printf("%d\n",-ans[i]);
}
2023/5/24 18:09
加载中...