萌新刚学莫队,10分WA求助
查看原帖
萌新刚学莫队,10分WA求助
498526
htssm楼主2022/3/4 15:12

求大佬看看吧。。。调了一天了。。。

#include<bits/stdc++.h>
#define hor(i,l,r) for(int i=l;i<=r;i++)
#define lor(i,l,r) for(int i=l;i>=r;i--)
#define un unsigned
#define fr front
#define se second
#define fi first
#define pb push_back
using namespace std;
template<typename T> inline void read(T &x){
	x=0;char c=getchar();bool flag=false;
	while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	if(flag)x=-x;
}
template<typename T> inline void write(T x){
   	short st[30],tp=0;
	if(x<0) putchar('-'),x=-x;
	do st[++tp]=x%10,x/=10; while(x);
	while(tp) putchar('0'|st[tp--]);
}
#define wr write
#define rd read
#define pk putchar(' ')
#define ed puts("")
bitset<100010>Ans[40001],u; 
int l,r,tot,a[1000001],len[1000001],b[1000001],mp[1000001],bl;
bool vis[500001];
struct node{
	int l,r,id;
}qs[500001];
bool cmp(node a,node b){
	if((a.l-1)/bl==(b.l-1)/bl) return a.r<b.r;
	return a.l<b.l;
}
void add(int p)
{
	u[p+(mp[p]++)]=1;
}
void del(int p)
{
	u[p+(--mp[p])]=0;
}
void solve(int ll,int rr){
	if(ll>rr) return;
	u.reset();
	memset(mp,0,sizeof(mp));
	memset(vis,0,sizeof(vis));
	sort(qs+ll*3-2,qs+rr*3+1,cmp);
	hor(i,ll,rr) Ans[i-ll].reset();
	l=r=1,add(1);
	hor(i,ll*3-2,rr*3){
		
	//	wr(qs[i].l),pk,wr(qs[i].r),ed;
		while(r<qs[i].r) add(a[++r]);
		while(r>qs[i].r) del(a[r--]);
		while(l>qs[i].l) add(a[--l]);
		while(l<qs[i].l) del(a[l++]);
	//	wr(l),pk,wr(r),ed;
		if(vis[qs[i].id-ll]) Ans[qs[i].id-ll]&=u;
		else Ans[qs[i].id-ll]=u,vis[qs[i].id-ll]=1;
	}
	hor(i,ll,rr){
		//wr(len[i]),ed;
		wr(len[i]-3*Ans[i-ll].count()),ed;
	}
}
signed main(){
	int n,m;
	rd(n),rd(m);
	bl=sqrt(n);
	hor(i,1,n) rd(a[i]),b[i]=a[i];
	sort(b+1,b+n+1);
	hor(i,1,n) a[i]=lower_bound(b+1,b+n+1,a[i])-b;
	hor(i,1,m){
		hor(j,1,3){
			rd(qs[++tot].l),rd(qs[tot].r);
			qs[tot].id=i;
			len[i]+=(qs[tot].r-qs[tot].l+1);
		}
	}
	solve(1,m/3),solve(m/3+1,2*m/3),solve(2*m/3+1,m);
}


2022/3/4 15:12
加载中...