请求 DEBUG
查看原帖
请求 DEBUG
922691
Hisy楼主2024/6/28 12:12
#include<algorithm>
#include<cstdio>
#include<cmath>
int type[40004],mark[40004],bars[202][40004],plan[202][202],hash[40004],block;
inline int nowblock(int now){
	return (now-1)/block+1;
};
inline int min(int first,int second){
	if(first<second){
		return first;
	};
	return second;
};
int main(int argc,char **argv){
	int size,action;
	scanf("%d %d",&size,&action);
	block=sqrt(size);
	for(int iter=1;iter<=size;++iter){
		scanf("%d",&type[iter]);
		mark[iter]=type[iter];
	};
	std::sort(mark+1,mark+1+size);
	int newsize=std::unique(mark+1,mark+1+size)-mark-1,count=nowblock(size);
	for(int iter=1;iter<=size;++iter){
		type[iter]=std::lower_bound(mark+1,mark+1+newsize,type[iter])-mark;
	};
	for(int first=1;first<=count;++first){
		for(int second=block*(first-1)+1;second<=min(block*first,size);++second){
			++bars[first][type[second]];
		};
		for(int second=1;second<=newsize;++second){
			bars[first][second]+=bars[first-1][second];
		};
	};
	for(int first=1;first<=count;++first){
		for(int second=first;second<=count;++second){
			int maxinum=plan[first][second-1];
			for(int third=block*(second-1);third<=min(block*second,size);++third){
				if((bars[second][type[third]]-bars[first-1][type[third]]>bars[second][maxinum]-bars[first-1][maxinum])||(bars[second][type[third]]==bars[second][maxinum]-bars[first-1][maxinum]&&type[third]<maxinum)){
					maxinum=type[third];
				};
			};
			plan[first][second]=maxinum;
		};
	};
	int last=0;
	do{
		int first,second;
		scanf("%d %d",&first,&second);
		first=(first+last-1)%size+1;
		second=(second+last-1)%size+1;
		if(first>second){
			std::swap(first,second);
		};
		int blockfirst=nowblock(first),blocksecond=nowblock(second),maxinum=0;
		if(blocksecond-blockfirst<=1){
			for(int iter=first;iter<=second;++iter){
				++hash[type[iter]];
			};
			for(int iter=first;iter<=second;++iter){
				if(hash[type[iter]]>hash[maxinum]||(hash[type[iter]]==hash[maxinum]&&type[iter]<maxinum)){
					maxinum=type[iter];
				};
			};
			for(int iter=first;iter<=second;++iter){
				hash[type[iter]]=0;;
			};
		}else{
			for(int iter=first;iter<=block*blockfirst;++iter){
				++hash[type[iter]];
			};
			for(int iter=block*(blocksecond-1)+1;iter<=second;++iter){
				++hash[type[iter]];
			};
			maxinum=plan[blockfirst+1][blocksecond-1];
			for(int iter=first;iter<=block*blockfirst;++iter){
				int prev=hash[maxinum]+bars[blocksecond-1][maxinum]-bars[blockfirst][maxinum];
				int next=hash[type[iter]]+bars[blocksecond-1][type[iter]]-bars[blockfirst][type[iter]];
				if(next>prev||(next==prev&&maxinum>type[iter])){
					maxinum=type[iter];
				};
			};
			for(int iter=block*(blocksecond-1)+1;iter<=second;++iter){
				int prev=hash[maxinum]+bars[blocksecond-1][maxinum]-bars[blockfirst][maxinum];
				int next=hash[type[iter]]+bars[blocksecond-1][type[iter]]-bars[blocksecond-1][type[iter]];
				if(next>prev||(next==prev&&maxinum>type[iter])){
					maxinum=type[iter];
				};
			};
			for(int iter=first;iter<=block*blockfirst;++iter){
				hash[type[iter]]=0;
			};
			for(int iter=block*(blocksecond-1)+1;iter<=second;++iter){
				hash[type[iter]]=0;
			};
		};
		printf("%d\n",last=mark[maxinum]);
	}while(--action);
	return 0;
};

样例过 5pts⁡\operatorname{5pts} 求调。

2024/6/28 12:12
加载中...