CF1541B Pleasant Pairs(思维+桶+枚举)

传送门

思路:

首先(O(n^{2}))的暴力不难想。
题目中有个条件是(a[i]<=2*n)
也就是说(a[i]*a[j]<=2*n)
这样第二层循环的范围就有所缩小
最坏情况下第二层会跑(2*n*(1+1/2+1/3+……+1/n))
(O(nlogn))
最后要记得开(long long)

代码:


const int maxn=2e5+100;

ll n,a[maxn],b[maxn];

int main(){
	int _=read;
	while(_--){
		n=read;
		rep(i,1,n) a[i]=read,b[a[i]]=i;
		sort(a+1,a+1+n);
		ll res=0;
		rep(i,1,n)
			for(ll j=i+1;j<=n&&a[i]*a[j]<=2*n;j++)
				if(a[i]*a[j]==b[a[i]]+b[a[j]]) res++;
		cout<<res<<endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/OvOq/p/15011418.html