这个蒟蒻昨天晚上写P3674交了一晚上死活TLE,今早找了一位题解区大佬的代码,改了下代码中的快读和switch,就过了,想问下是因为什么导致代码差距那么大
T的代码:(这部分快读,register,O2都用过,最高60)
#include<bits/stdc++.h>
#include<bitset>
using namespace std;
const int MAXN=1e5+10;
const int N=1e5+10;
int n,m,siz,bnum,bl[MAXN],cnt[MAXN],a[MAXN];
bool ans[MAXN];
bitset<MAXN+10>s,S;
struct Q{
int opt,l,r,x,id;
bool operator <(const Q&B)const{return (bl[l]^bl[B.l])?l<B.l:(bl[r]&1)?r<B.r:r>B.r;}
}q[MAXN];
inline void add(int x){if(!cnt[x]++)s[x]=1,S[N-x]=1;}
inline void del(int x){if(!--cnt[x])s[x]=0,S[N-x]=0;}
int main(){
scanf("%d%d",&n,&m);siz=(int)sqrt(m);
for(register int i=1;i<=n;++i)scanf("%d",&a[i]);
//for(register int i=1;i<=n;++i)bl[i]=(i-1)/siz+1;
for(register int i=1;i<=m;++i){scanf("%d%d%d%d",&q[i].opt,&q[i].l,&q[i].r,&q[i].x);q[i].id=i;bl[q[i].l]=(q[i].l-1)/siz+1,bl[q[i].r]=(q[i].r-1)/siz+1;}
sort(q+1,q+m+1);int l=1,r=0;
for(register int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r,O=q[i].opt,x=q[i].x,I=q[i].id;
while(l<ql)del(a[l++]);
while(l>ql)add(a[--l]);
while(r<qr)add(a[++r]);
while(r>qr)del(a[r--]);
if(O==1)ans[I]=((s&(s<<x))).any();
if(O==2)ans[I]=(s&(S>>(N-x))).any();
if(O==3){
for(int j=1;j*j<=x;++j)
if(s[j]&&s[x/j]&&x%j==0){
ans[I]=true;
break;
}
}
}
for(register int i=1;i<=m;++i){puts(ans[i]?"hana":"bi");}
return 0;
}
下面是过掉的代码,连O2都没用:
#include<bits/stdc++.h>
#include<bitset>
using namespace std;
const int MAXN=1e5+10;
const int N=1e5+10;
int n,m,siz,bl[MAXN],cnt[MAXN],a[MAXN],bnum;
char buf[1<<21],*p1=buf,*p2=buf;
bool ans[MAXN];
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline int read(){
#define num ch-'0'
char ch;bool fg=0;int res=0;
while(!isdigit(ch=getc()))(ch=='-')&&(fg=true);
for(res=num;isdigit(ch=getc());res=res*10+num);
fg&&(res=-res);
#undef num
return res;
}
bitset<MAXN>s,S;
struct Q{
int opt,l,r,x,id;
}q[MAXN];
inline bool cmp(Q A,Q B){return (bl[A.l]^bl[B.l])?bl[A.l]<bl[B.l]:(bl[A.l]&1)?A.r<B.r:A.r>B.r;}
inline void add(int x){if(!cnt[x]++)s[x]=1,S[N-x]=1;}
inline void del(int x){if(!--cnt[x])s[x]=0,S[N-x]=0;}
int main(){
n=read(),m=read();siz=n/sqrt(m);bnum=ceil(double(n/siz));
for(register int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=bnum;++i)for(int j=(i-1)*siz+1;j<=i*siz;++j)bl[j]=i;
for(register int i=1;i<=m;++i){q[i].opt=read(),q[i].l=read(),q[i].r=read(),q[i].x=read(),q[i].id=i;}
sort(q+1,q+m+1,cmp);int l=1,r=0;
for(register int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r,O=q[i].opt,x=q[i].x,I=q[i].id;
while(l<ql)del(a[l++]);
while(l>ql)add(a[--l]);
while(r<qr)add(a[++r]);
while(r>qr)del(a[r--]);
switch(O){
case 1:{
//if((s&(s<<x)).any())ans[I]=1;
ans[I]=(s&(s<<x)).any();
break;
}
case 2:{
ans[I]=((s&(S>>(N-x))).any());
break;
}
case 3:{
for(int j=1;j*j<=x;++j)if(!(x%j)&&s[j]&&s[x/j]){ans[I]=1;break;}
break;
}
}
}
for(register int i=1;i<=m;++i){puts(ans[i]?"hana":"bi");}
return 0;
}
蒟蒻不清楚到底是哪里导致性能差距这么大,(也有可能是手残但是蒟蒻没看出来),求大佬指教