12pts求调
查看原帖
12pts求调
752116
Rukkhadevata楼主2024/10/23 22:05
#include<iostream>
#include<cmath>
#include<algorithm> 
#define isdigit(x) ((x) >= '0' && (x) <= '9')
using namespace std;
int belong[300010],m,n,c,a[300010];
int ans,maxc,maxid,solc[300010];
bool sol[300010];
int vis[20010];
struct query{
	int l,r,id;
} q[300010];
bool cmp(query a, query b) {
    return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
void add(int pos){
	vis[a[pos]]++;
	maxc=max(maxc,vis[a[pos]]);
	if(maxc==vis[a[pos]]) maxid=a[pos];
}
void del(int pos)
{
	vis[a[pos]]--;
}
int read() {
	int res = 0;
	char c = getchar();
	while(!isdigit(c)) c = getchar();
	while(isdigit(c)) res = (res << 1) + (res << 3) + c - 48, c = getchar();
	return res;
}
int main()
{
	n=read();c=read();
	for(int i=1;i<=n;i++) a[i]=read();
	m=read();
	for(int i=1;i<=m;i++){
		q[i].l=read(),q[i].r=read();
		q[i].id=i;
	}
	int size=sqrt(n);int upper=ceil(double(n/size));
	for(int i=1;i<=upper;i++)
	{
		for(int j=(i-1)*size+1;j<=i*size;j++){
			belong[j]=i;
		}
	}
	sort(q+1,q+m+1,cmp);
	int nl=1,nr=0;
	for(int i=1;i<=m;i++)
	{
		maxc=0;maxid=0;
		int ql=q[i].l,qr=q[i].r;
		while(nl < ql) del(nl++);
		while(nl > ql) add(--nl);
		while(nr < qr) add(++nr);
		while(nr > qr) del(nr--);
		int k=(qr-ql+1)/2;
		if(maxc>k) sol[q[i].id]= true,solc[q[i].id]=maxid;
		else sol[q[i].id]=false;
	}
	for(int i=1;i<=m;i++){
		if(sol[i]) printf("yes %d",solc[i]);
		else printf("no");
		printf("\n");
	}
	
	return 0;
} 

样例是过了的,用的模板也A了其他几个板子

S组蒟蒻为了骗分的最后一搏

2024/10/23 22:05
加载中...