全RE求助
查看原帖
全RE求助
171868
sunzz3183楼主2023/4/22 16:45

rt

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    char ch=getchar();int x=0;bool f=1;
    while(ch<'0'||'9'<ch){if(ch=='-')f=0;ch=getchar();}
    while('0'<=ch&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return f?x:-x;
}
const int N=1e5+5,M=10002;
int n,m,a[N],pos[N],book[N];
struct qwq{
    int l,r,id;
    bitset<100001>bs;
}q[M*3];
vector<int>v;
bitset<100001>vis;
inline int getid(int x){
    return upper_bound(v.begin(),v.end(),x)-v.begin();
}
void sub(int x){
    book[a[x]]--;
    vis.reset(a[x]-book[a[x]]);
    return;
}
void add(int x){
    vis.set(a[x]-book[a[x]]);
    book[a[x]]++;
    return;
}
void solve(int T){
    vis.reset();
    for(int i=0;i<T;i++){
        q[i*3+1]={read(),read(),i*3+1};
        q[i*3+2]={read(),read(),i*3+2};
        q[i*3+3]={read(),read(),i*3+3};
    }
    sort(q+1,q+T*3+1,[](qwq x,qwq y){return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];});
    for(int i=1,l=1,r=0;i<=T*3;i++){
        while(l>q[i].l)add(--l);
        while(r<q[i].r)add(++r);
        while(l<q[i].l)sub(l++);
        while(r>q[i].r)sub(r--);
        q[i].bs=vis;
    }
    sort(q+1,q+T*3+1,[](qwq x,qwq y){return x.id<y.id;});
    for(int i=0;i<T;i++){
        int siz=(q[i*3+1].bs&q[i*3+2].bs&q[i*3+3].bs).count();
        printf("%d\n",q[i*3+1].r-q[i*3+1].l+1+q[i*3+2].r-q[i*3+2].l+1+q[i*3+3].r-q[i*3+3].l+1-siz*3);
    }
    return;
}
signed main(){
    // freopen(".in","r",stdin);
    // freopen(".out","w",stdout);
    n=read();m=read();
    int ql=1000,bl=sqrt(n);
    for(int i=1;i<=n;i++)a[i]=read(),pos[i]=(i-1)/bl+1,v.push_back(a[i]);
    sort(v.begin(),v.end());
    for(int i=1;i<=n;i++)a[i]=getid(a[i]);
    while(m>ql)solve(ql),m-=ql;
    solve(m);
    return 0;
}
2023/4/22 16:45
加载中...