用户工具

站点工具


2020-2021:teams:looking_up_at_the_starry_sky:我跑得很慢的代码
#include<bits/stdc++.h>
using namespace std;
const int T=100009;
const int maxn=200009;
const int SIZE=500;
const int B=34000;
 
int n,m,Tn;
 
int a[maxn];
int b[maxn];
 
bitset<T>f[B+9],now;
int c[T];
 
int nn;
struct Section{
    int l,r,id;
    bool operator < (const Section &rhs) const{
        if(l/SIZE==rhs.l/SIZE)return r<rhs.r;
        else return l<rhs.l;
    }
}p[maxn];
 
void insert(int x){
    now.set(x+c[x],1);++c[x];
}
void delt(int x){
    --c[x];now.set(x+c[x],0);
}
 
int l1[B+9],r1[B+9],l2[B+9],r2[B+9],l3[B+9],r3[B+9];
void solve(){
    nn=0;
    for(int i=1;i<=m;++i){
        p[++nn].l=l1[i];p[nn].r=r1[i];p[nn].id=i;
        p[++nn].l=l2[i];p[nn].r=r2[i];p[nn].id=i;
        p[++nn].l=l3[i];p[nn].r=r3[i];p[nn].id=i;
    }
    sort(p+1,p+1+nn);
    int L=1,R=0;
    memset(c,0,sizeof(c));
    now.reset();
    for(int i=1;i<=m;++i)f[i].set();
    for(int i=1;i<=nn;++i){
        while(R<p[i].r)insert(a[++R]);
        while(L>p[i].l)insert(a[--L]);
        while(R>p[i].r)delt(a[R--]);
        while(L<p[i].l)delt(a[L++]);
        f[p[i].id]&=now;
    }
    for(int i=1;i<=m;++i){
        int siz=r1[i]-l1[i]+r2[i]-l2[i]+r3[i]-l3[i]+3-3*f[i].count();
        printf("%d\n",siz);
    }
}
 
int main(){
    scanf("%d%d",&n,&Tn);
    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]=lower_bound(b+1,b+1+n,a[i])-b;
 
    while(Tn--){
        ++m;
        scanf("%d%d%d%d%d%d",&l1[m],&r1[m],&l2[m],&r2[m],&l3[m],&r3[m]);
        if(m==B){
            solve();
            m=0;
        }
    }
    if(m)solve();
    return 0;
}
2020-2021/teams/looking_up_at_the_starry_sky/我跑得很慢的代码.txt · 最后更改: 2020/05/15 22:51 由 zzy