关于为什么 #define 这么快
  • 板块灌水区
  • 楼主蒟酱厂妹
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/4/16 00:42
  • 上次更新2023/10/28 03:39:20
查看原帖
关于为什么 #define 这么快
310818
蒟酱厂妹楼主2022/4/16 00:42
#include<iostream>
#include<cstdio>
#include<algorithm>
using std::cin;using std::cout;
int a[40007],bl[40007],f[207][207],s[207][40007],mp[40007],cnt[40007];
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);cin.tie(nullptr);
	int i,j,k,n,m,l,r,x=0;cin>>n>>m;int sz=__builtin_sqrt(n),num=0;
	for(i=1;i<=n;i++){cin>>a[i];mp[i]=a[i];if(i%sz==1)num++;bl[i]=num;}
	std::sort(mp+1,mp+1+n);l=std::unique(mp+1,mp+n+1)-mp-1;
	for(i=1;i<=n;i++)a[i]=std::lower_bound(mp+1,mp+1+l,a[i])-mp;
	for(i=1;i<=num;i++)for(j=sz*(i-1)+1;j<=std::min(n,sz*i);j++)s[i][a[j]]++;
	for(i=1;i<=num;i++)for(j=1;j<=l;j++)s[i][j]+=s[i-1][j];
	#define compare(d1,n1,d2,n2) if((d1>d2)||(n1<n2&&d1==d2))n2=n1
	for(i=1;i<=num;i++)for(j=i;j<=num;j++)for(f[i][j]=f[i][j-1],k=sz*(j-1)+1;k<=std::min(n,sz*j);k++)
		compare(s[j][a[k]]-s[i-1][a[k]],a[k],s[j][f[i][j]]-s[i-1][f[i][j]],f[i][j]);
	while(m--){
		cin>>l>>r;l=(l+x-1)%n+1;r=(r+x-1)%n+1;if(l>r)std::swap(l,r);
		if(bl[r]-bl[l]<=1){
			for(x=0,i=l;i<=r;i++)cnt[a[i]]++;
			for(i=l;i<=r;i++)compare(cnt[a[i]],a[i],cnt[x],x);
			for(i=l;i<=r;i++)cnt[a[i]]=0;
			cout<<(x=mp[x])<<'\n';continue;
		}
		#define count(x) cnt[x]+s[bl[r]-1][x]-s[bl[l]][x]
		for(x=f[bl[l]+1][bl[r]-1],i=l;i<=sz*bl[l];i++)cnt[a[i]]++;
		for(i=sz*(bl[r]-1)+1;i<=r;i++)cnt[a[i]]++;
		for(i=l;i<=sz*bl[l];i++)compare(count(a[i]),a[i],count(x),x);
		for(i=sz*(bl[r]-1)+1;i<=r;i++)compare(count(a[i]),a[i],count(x),x);
		for(i=l;i<=sz*bl[l];i++)cnt[a[i]]=0;
		for(i=sz*(bl[r]-1)+1;i<=r;i++)cnt[a[i]]=0;
		cout<<(x=mp[x])<<'\n';
	}
	return 0;
}

这分代码在蒲公英里只要跑 1.09s,但是把 #define 改成 inline 的函数却要 1.22s,但是我这个 #define 展开

if((cnt[a[i]]+s[bl[r]-1][a[i]]-s[bl[l]][a[i]]>cnt[x]+s[bl[r]-1][x]-s[bl[l]][x])||(a[i]<x&&cnt[a[i]]+s[bl[r]-1][a[i]]-s[bl[l]][a[i]]==cnt[x]+s[bl[r]-1][x]-s[bl[l]][x]))x=a[i]

差不多是这么恶心的一坨东西,数组寻址按理要找死人,换成 inline 只要寻址 1 次,为什么反而变慢了。
最后祝各位巨佬 rp++

2022/4/16 00:42
加载中...