请求加强数据
查看原帖
请求加强数据
767630
Flandres楼主2023/3/23 17:29

请求加强此题数据,我莫队+O(n)O(n)暴力修改都卡过去了qwq

#include<bits/stdc++.h>
using namespace std;
const int N=10000010;
int n,m,t,a[N],pos[N],cnt[N],maxn;
int ans1,ans2,ans[N][2];
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
struct Mo {
	int ql,qr,l,r,id;
	bool operator <(const Mo &x)const {
		return pos[ql]^pos[x.ql]?ql<x.ql:(pos[ql]&1)?qr<x.qr:qr>x.qr;
	}
}q[N];

inline void add(int x) {
	++cnt[x];
}

inline void del(int x) {
	--cnt[x];
}

int main() {
	n=read();m=read();
	t=sqrt(n);
	t=max(t,1);
	for(int i=1;i<=n;++i) a[i]=read(),maxn=max(maxn,a[i]),pos[i]=(i-1)/t+1;
	for(int i=1;i<=m;++i) {
		q[i].ql=read();
		q[i].qr=read();
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+1+m);
	for(int i=1,l=1,r=0;i<=m;++i) {
		while(l>q[i].ql) add(a[--l]);
		while(l<q[i].ql) del(a[l++]);
		while(r>q[i].qr) del(a[r--]);
		while(r<q[i].qr) add(a[++r]);
		int rr=min(maxn,q[i].r);
		ans1=0,ans2=0;
		for(int j=q[i].l;j<=rr;++j) {
			ans1+=cnt[j];
			if(cnt[j]) ans2++;
		}
		ans[q[i].id][0]=ans1;
		ans[q[i].id][1]=ans2;
	}
	for(int i=1;i<=m;++i)
		printf("%d %d\n",ans[i][0],ans[i][1]);
	return 0;
}
2023/3/23 17:29
加载中...