求助莫队板子
查看原帖
求助莫队板子
230804
Durancer楼主2021/9/1 08:58

用别的经验题都试过了,没有问题,但是交上去就是一直 RE\text{RE} qwq,求差错。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<map>
#define int long long 
using namespace std;
const int N=5e5+9;
const int M=5e5+9;
struct node{
	int l,r;
	int id;
	int k;
}q[N];
int n,Q,bl;
bool ans[N];
int a[N],b[N];
int top;
int L=1,R=0;
int cnt[N],sum[N];
int tot;
map<int,int> mp;
int read()
{
	int f=1,x=0;
	char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+(s^'0');s=getchar();}
	return f*x;
} 
void Prepare()
{
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)
		if(i==1 or b[i-1]!=b[i])
			mp[b[i]]=++top;
	for(int i=1;i<=n;i++)
		a[i]=mp[a[i]];
}
bool cmp(node x,node y)
{
	return (x.l/bl==y.l/bl) ? x.r<y.r : x.l<y.l;
}
void del(int x)
{
	sum[cnt[x]]--;
	if(!sum[cnt[x]] and tot==cnt[x])
		tot=cnt[x]-1;
	cnt[x]--;
	sum[cnt[x]]++;
}
void add(int x)
{
	sum[cnt[x]]--;
	cnt[x]++;
	sum[cnt[x]]++;	
	tot=max(tot,cnt[x]); 
}
signed main()
{
	n=read(); Q=read(); bl=pow(n,0.666);
	for(int i=1;i<=n;i++)
		b[i]=a[i]=read();
	Prepare();
	for(int i=1;i<=Q;i++)
	{
		q[i].l=read(); q[i].r=read();
		q[i].k=read();
		q[i].id=i;
	}
	sort(q+1,q+1+Q,cmp);
	for(int i=1;i<=Q;i++)
	{
		while(L<q[i].l) del(a[L++]);
		while(L>q[i].l) add(a[--L]);
		while(R>q[i].r) del(a[R--]);
		while(R<q[i].r) add(a[++R]);
		int two=q[i].r-q[i].l+1;
		int one=tot*q[i].k;
		if(one>=two)
			ans[q[i].id]=true;
		else ans[q[i].id]=false;
		//ans[q[i].id]=((tot*q[i].k) >= (q[i].r-q[i].l+1));
	}
	for(int i=1;i<=Q;i++)
		if(ans[i])
			printf("YES\n");
		else printf("NO\n");
    return 0;
} 
2021/9/1 08:58
加载中...