wa了几十发才找出这个问题???结构体下标访问慢??还是题目问题??
查看原帖
wa了几十发才找出这个问题???结构体下标访问慢??还是题目问题??
264063
SuperA楼主2020/11/7 23:09
**下面的两份代码,除了注释的地方不一样,其他的全都一样,为什么第二个就100ms不到就过了,另外一个直接就1s都过不了,什么情况???!!!
是结构体下标访问很慢还是什么情况???!!!

求解!!!**

#include<bits/stdc++.h>
#define M 1000005
using namespace std;
int n,m,blocksize,l,r,cnt,ql,qr;
int a[M],sum[M],ans[M];
struct node{
    int l,r,id,bi;
}range[M];
inline bool cmp(node a,node b){
    return a.bi^b.bi?a.l<b.l:((a.bi&1)?a.r<b.r:a.r>b.r);
}
int main(){
    scanf("%d",&n);
    for(register int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    blocksize=sqrt(n);
    for(register int i=1;i<=m;++i){
//        scanf("%d%d",&l,&r);
//		range[i]={l,r,i,(l-1)/blocksize+1};
        scanf("%d%d",&range[i].l,&range[i].r);
        range[i].id=i;
        range[i].bi=(i-1)/blocksize;
    }
    sort(range+1,range+1+m,cmp);
    l=0,r=0,cnt=0;
    for(register int i=1;i<=m;++i){
        ql=range[i].l,qr=range[i].r;
        while(l<ql) if(--sum[a[l++]]==0) --cnt;
        while(l>ql) if(++sum[a[--l]]==1) ++cnt;
        while(r<qr) if(++sum[a[++r]]==1) ++cnt;
        while(r>qr) if(--sum[a[r--]]==0) --cnt;
        ans[range[i].id]=cnt;
    }
    for(register int i=1;i<=m;++i){
        printf("%d\n",ans[i]);
    }
    return 0;
}

#include<bits/stdc++.h>
#define M 1000005
using namespace std;
int n,m,blocksize,l,r,cnt,ql,qr;
int a[M],sum[M],ans[M];
struct node{
    int l,r,id,bi;
}range[M];
inline bool cmp(node a,node b){
    return a.bi^b.bi?a.l<b.l:((a.bi&1)?a.r<b.r:a.r>b.r);
}
int main(){
    scanf("%d",&n);
    for(register int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    blocksize=sqrt(n);
    for(register int i=1;i<=m;++i){
        scanf("%d%d",&l,&r);
		range[i]={l,r,i,(l-1)/blocksize+1};
//        scanf("%d%d",&range[i].l,&range[i].r);
//        range[i].id=i;
//        range[i].bi=(i-1)/blocksize;
    }
    sort(range+1,range+1+m,cmp);
    l=0,r=0,cnt=0;
    for(register int i=1;i<=m;++i){
        ql=range[i].l,qr=range[i].r;
        while(l<ql) if(--sum[a[l++]]==0) --cnt;
        while(l>ql) if(++sum[a[--l]]==1) ++cnt;
        while(r<qr) if(++sum[a[++r]]==1) ++cnt;
        while(r>qr) if(--sum[a[r--]]==0) --cnt;
        ans[range[i].id]=cnt;
    }
    for(register int i=1;i<=m;++i){
        printf("%d\n",ans[i]);
    }
    return 0;
}

2020/11/7 23:09
加载中...