蒟蒻问一下代码常数问题
  • 板块学术版
  • 楼主Refined_heart
  • 当前回复17
  • 已保存回复17
  • 发布时间2020/5/30 10:36
  • 上次更新2023/11/7 01:28:30
查看原帖
蒟蒻问一下代码常数问题
128591
Refined_heart楼主2020/5/30 10:36

这个蒟蒻昨天晚上写P3674P3674交了一晚上死活TLE\text{TLE},今早找了一位题解区大佬的代码,改了下代码中的快读和switchswitch,就过了,想问下是因为什么导致代码差距那么大

T的代码:(这部分快读,register,O2O_2都用过,最高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;
}

下面是过掉的代码,连O2O2都没用:

#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;
}

蒟蒻不清楚到底是哪里导致性能差距这么大,(也有可能是手残但是蒟蒻没看出来),求大佬指教

2020/5/30 10:36
加载中...