88pts求调,悬关
查看原帖
88pts求调,悬关
1120828
linjinkun楼主2024/7/31 08:58

做完了大爷的字符串之后,我又做了这道题,但是死活过不了,最后一个点 RE,负数也处理了,就是过不了。

#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+5;
struct node
{
	int l,r,num;
}q[N];
int n,m,k,a[N],ans[N],l = 1,r,s[N],len,id[N];
int t[N];
int maxx;
int cmp(node x,node y)
{
	if(id[x.l] == id[y.l])
	{
		if(id[x.l]&1)
		{
			return x.r<y.r;
		}
		else
		{
			return x.r>y.r;
		}
	}
	return id[x.l]<id[y.l];
}
void add(int x)//添加 
{
	t[s[x]]--;
	t[++s[x]]++;
	maxx = max(maxx,s[x]);
}
void del(int x)//删除 
{
	t[s[x]]--;
	if(s[x] == maxx&&t[s[x]] == 0)
	{
		maxx--;
	}
	t[--s[x]]++;
}
signed main()
{
	int k;
	scanf("%d %d",&n,&m);
	len = sqrt(n);
	for(int i = 1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		a[i]+=int(1e5);
		id[i] = (i+1)/len+1;
	}
	for(int i = 1;i<=m;i++)
	{
		scanf("%d %d",&q[i].l,&q[i].r);
		q[i].num = i;
	}
	sort(q+1,q+m+1,cmp);
	for(int i = 1;i<=m;i++)
	{
		while(r<q[i].r)
		{
			add(a[++r]);
		}
		while(r>q[i].r)
		{
			del(a[r--]);
		}
		while(l<q[i].l)
		{
			del(a[l++]);
		}
		while(l>q[i].l)
		{
			add(a[--l]);
		}
		ans[q[i].num] = maxx;
	}
	for(int i = 1;i<=m;i++)
	{
		printf("%d\n",ans[i]);
	}
	return 0; 
}
2024/7/31 08:58
加载中...