莫队 91 wa#4 求助 期望1 输出2
查看原帖
莫队 91 wa#4 求助 期望1 输出2
297103
阴语飞楼主2022/9/24 20:13

不知道是不是查询区间l=r的情况,但加上特判的话还是一样(一开始想会不会和ans 初值有关系,但好像不论ans=1或是都是一样的第5002行错了)

大佬教教偶啊!

#include<bits/stdc++.h>
using namespace std;
int n,q,sq,l=1,r=0,ans=1;
struct node
{
	int ll,rr,ti;//ti 记录当前区间的ans 
}ask[200200];
int a[100100],b[100100],vis[200100],cnt[200100];//cnt数组记录出现次数为 i的数的个数 
inline int IN()
{
	int x,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1,ch=getchar();}
	while('0'<=ch&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
inline void write(int x)
{
    if(x<0){
    	putchar('-');
		x=-x;
	}
    if(x>9) 
		write(x/10);
    putchar(x%10+'0');
}
inline bool cmp(node a,node b)
{
//	if(a.ll/sq==b.ll/sq) 

	if(a.ll==b.ll) return a.rr<b.rr;
	else return a.ll<b.ll;
}
inline void l_delete(int &l,int lll)
{
	while(l<lll)//左删 
	{
		cnt[vis[a[l]]]--;//减少原有数量 
		if(cnt[ans]==0) ans--;
		vis[a[l]]--;//数的出现次数减一 
		cnt[vis[a[l]]]++;//出现新的次数+1	
		l++;//指针移动 
	}
}
inline void l_add(int &l,int lll)
{
	while(l>lll)//左加
	{
		l--;//指针移动
		if(vis[a[l]]==ans) ans++;
		cnt[vis[a[l]]]--;
		vis[a[l]]++;
		cnt[vis[a[l]]]++;
	} 
}
inline void r_delete(int &r,int rrr)
{
	while(r>rrr)//右减
	{
		cnt[vis[a[r]]]--;
		if(cnt[ans]==0) ans--;
		vis[a[r]]--;
		cnt[vis[a[r]]]++;
		r--;
	}
}
inline void r_add(int &r,int rrr)
{
	while(r<rrr)//右加
	{
		r++;
		if(vis[a[r]]==ans) ans++;
		cnt[vis[a[r]]]--;
		vis[a[r]]++;
		cnt[vis[a[r]]]++;
	}	
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>n>>q;
	//n=IN(),q=IN(),sq=sqrt(n);
	for(int i=1;i<=n;i++)
		cin>>a[i],b[i]=a[i];
	//	b[i]=a[i]=IN();
	//进行离散化 
	sort(b+1,b+1+n);
	int k=unique(b+1,b+1+n)-b-1;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(b+1,b+k+1,a[i])-b; 

	for(int i=1;i<=q;i++)
		cin>>ask[i].ll>>ask[i].rr;
		//ask[i].ll=IN(),ask[i].rr=IN();
	sort(ask+1,ask+1+q,cmp);
	for(int i=1;i<=q;i++)
	{
		int lll=ask[i].ll;
		int rrr=ask[i].rr;
		l_delete(l,lll);
		l_add(l,lll);
		r_add(r,rrr);
		r_delete(r,rrr);
		ask[i].ti=ans;
	}
	for(int i=1;i<=q;i++)
		cout<<ask[i].ti<<'\n';

 } 
2022/9/24 20:13
加载中...