求助分块
查看原帖
求助分块
394167
Cure_Wing楼主2023/8/22 23:12

这题是我实现太烂了?还是分块就是会被卡?

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using std::cin;using std::cout;
constexpr int N=500005;
int n,q,a[N],l,r,ans,cnt[N];
struct node{int k,len;std::vector<int>a;}edge[N];
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>q;
	for(int i=1;i<=n;++i){
		cin>>a[i];edge[a[i]].k=a[i];
		edge[a[i]].a.push_back(i);
		++edge[a[i]].len;
	}
	std::sort(edge+1,edge+n+1,[](node a,node b){return a.len>b.len;});
	for(int i=1;i<=q;++i){
		cin>>l>>r;ans=0;
		if(r-l+1<sqrt(2.5*n)){
			for(int j=l;j<=r;++j) ++cnt[a[j]];
			for(int j=l;j<=r;++j){
				if(cnt[a[j]]>((r-l+1)>>1))
					if(ans==0||a[j]<ans)
						ans=a[j];
				cnt[a[j]]=0;
			}
			cout<<ans<<'\n';
			continue;
		}
		for(int j=1;j<=n&&edge[j].len>((r-l+1)>>1);++j){
			int lans=-1,rans=-1,L=0,R=edge[j].len-1;
			while(L<=R){
				int mid=(L+R)>>1;
				if(l<=edge[j].a[mid]) lans=mid,R=mid-1;
				else L=mid+1;
			}
			L=0,R=edge[j].len-1;
			while(L<=R){
				int mid=(L+R)>>1;
				if(edge[j].a[mid]<=r) rans=mid,L=mid+1;
				else R=mid-1; 
			}
			// cout<<lans<<' '<<rans<<'\n';
			if(lans!=-1&&rans!=-1&&(rans-lans+1)>((r-l+1)>>1))
				if(ans==0||edge[j].k<ans)
					ans=edge[j].k;
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2023/8/22 23:12
加载中...