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


posted @ 2021-07-14 16:05  OvO1  阅读(150)  评论(0编辑  收藏  举报