全 RE 求助/kk
查看原帖
全 RE 求助/kk
247269
MSqwq楼主2021/5/26 22:38
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cmath>
#define ll long long
using namespace std;
int n,m,g;
int a[100010],b[100010];
int len[100010],cnt[100010];
struct ms{int l,r,id;}q[400010];
int tot,l=1,r,ql,qr,qi;
bool cmp(ms x,ms y){return x.r/g==y.r/g?x.l<y.l:x.r<y.r;}
void add(int l,int r,int i)
{
	q[++tot].l=l;
	q[tot].r=r;
	q[tot].id=i;
	len[i]+=r-l+1;
}
bitset<100010>now,ans[40010];
void add(int x)
{
	now[a[x]-cnt[a[x]]]=1;
	cnt[a[x]]++;
}
void del(int x)
{
	cnt[a[x]]--;
	now[a[x]-cnt[a[x]]]=0;
}
int main()
{
	scanf("%d%d",&n,&m);
	g=sqrt(n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)a[i]=upper_bound(b+1,b+1+n,a[i])-b-1;
	
	for(int i=1;i<=m;i++)
	{
		int l1,r1,l2,r2,l3,r3;
		scanf("%d%d%d%d%d%d",&l1,&r1,&l2,&r2,&l3,&r3);
		add(l1,r1,i),add(l2,r2,i),add(l3,r3,i);
	}
	sort(q+1,q+1+tot,cmp);
	
	for(int i=1;i<=m;i++)ans[i].set();
	
	for(int i=1;i<=tot;i++)
	{
		ql=q[i].l,qr=q[i].r,qi=q[i].id;
		while(r<qr)add(++r);
		while(l>ql)add(--l);
		while(r>qr)del(r--);
		while(l<ql)del(l++);
		ans[qi]&=now;
	}
	for(int i=1;i<=m;i++)printf("%d\n",len[i]-ans[i].count()*3);
} 
2021/5/26 22:38
加载中...