萌新求助qwq WA + RE
查看原帖
萌新求助qwq WA + RE
247269
MSqwq楼主2021/5/27 22:00
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<cmath>
#define ll long long
using namespace std;
const int N=1e5+10,M=25010;
int n,m,g;
int a[N],b[N];
int len[N],cnt[N],v[M],op[N<<2];
struct ms{int l,r,id;}q[N<<2];
int tot,l=1,r,ql,qr,qi;
bool cmp(ms x,ms y){return op[x.l]==op[y.l]?x.r<y.r:op[x.l]<op[y.l];}
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<N>now,ans[M];
void add(int x)
{
    cnt[a[x]]++;
    now[a[x]+cnt[a[x]]-1]=1;
}
void del(int x)
{
    cnt[a[x]]--;
    now[a[x]+cnt[a[x]]]=0;
}
void solve(int k)
{
	memset(cnt,0,sizeof(cnt));
	memset(v,0,sizeof(v));
	memset(len,0,sizeof(len));
	tot=0;
    for(int i=1;i<=k;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<=tot/3;i++)ans[i].set();
	now.reset();
	l=1,r=0;
	
	
    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++);
        if(!v[qi])ans[qi]=now,v[qi]=1;
        else ans[qi]&=now;
    }
    for(int i=1;i<=k;i++)printf("%d\n",len[i]-ans[i].count()*3);
}
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],op[i]=(i-1)/g+1;
    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;
    int T=M-10;
    while(m)
    {
    	if(m<T)
    	{
    		solve(m);
    		break;
		}
		else solve(T),m-=T;
	}
	return 0;
} 
2021/5/27 22:00
加载中...