首页 > 其他分享 >【题解】CF1830B The BOSS Can Count Pairs

【题解】CF1830B The BOSS Can Count Pairs

时间:2023-09-10 20:46:26浏览次数:47  
标签:Count NN int 题解 数对 sqrt 枚举 && CF1830B

你考虑,我们观察数据范围,发现可以是 \(O(n\sqrt n) / O(n\log n)\) 的,我们又看到乘法,便有几个大概的想法:

  • 数论分块
  • \(O(\sqrt n)\) 枚举其中一个乘数
  • 还有什么……(笔者学识浅陋,读者可以帮忙补充)

我们可以找到两种 \(O(n^2)\) 做法:

  • \(O(n^2)\) 枚举数对 \((i,j)\) 然后进行判断。(这个很好想,就是平常的暴力)
  • \(O(n^2)\) 一个 \(n\) 枚举 \(a_i\) 的值,并将 \(b_i\) 记录在桶中,另一个 \(n\) 枚举 \(j\) 并在桶中查找 \(a_i \times a_i - b_j\) (有时候换一种枚举方式 确实不失为一种打开新思路的好方法)

我们可以发现 \(a_i \times a_j\) 是不大于 \(2n\) 的,所以里面最小的数是不大于 \(\sqrt {2n}\) 的,然后我们就可以将第一维从 \(O(n)\) 变为 \(O(\sqrt n)\)。

当然细节上还是需要处理一下,因为每个数对只能出现一次,所以我们让 \(a\) 小的在前面,\(a\) 大的在后面,\(a\) 相同再是按下标(说得有点玄乎?看不懂可以直接看代码,代码还是很好懂的)。

然后我们就做完了这道题。

code:

#include<bits/stdc++.h>
using namespace std;
const int NN = 2e5 + 8; 
typedef long long ll;
int T;
int n;
int a[NN],b[NN];
int cnt[NN << 1];
int main(){
	scanf("%d",&T);
	while(T--){
		ll ans = 0;
		scanf("%d",&n);
		for(int i = 1; i <= n; ++i) scanf("%d",&a[i]);
		for(int i = 1; i <= n; ++i) scanf("%d",&b[i]);
		int c = sqrt(2 * n) + 1;
		for(int j = 1; j <= c; ++j){
			for(int i = 0; i <= n; ++i) cnt[i] = 0;
			for(int i = 1; i <= n; ++i) if(a[i] == j){
				if(j*j - b[i] >= 0 && j * j - b[i] <= n) ans += cnt[j*j-b[i]];
				++cnt[b[i]];
			} 
			for(int i = 1; i <= n; ++i){
				if(a[i]*j-b[i] >= 0 && a[i] > j && a[i] * j - b[i] <= n) ans += cnt[a[i]*j-b[i]];
			}
		}
		printf("%lld\n",ans);
	}
}

标签:Count,NN,int,题解,数对,sqrt,枚举,&&,CF1830B
From: https://www.cnblogs.com/rickylin/p/17691853.html

相关文章

  • 【题解】[ABC318F] Octopus(思维)
    【题解】[ABC318F]Octopus题目链接F-Octopus题意概述有个机器人,它有\(n\)个手臂,第\(i\)个手臂长度为\(l_i\)。同时有\(n\)个宝藏,第\(i\)个宝藏的坐标是\(x_i\)。当机器人位于\(k\)时,它的第\(i\)条手臂可以够到\([k-l_i,k+l_i]\)范围内的宝藏。机器人的每......
  • [ABC319D] Minimum Width 题解
    [ABC319D]MinimumWidth题解题意分析  给定\(n\)个单词,现在想像“记事本”一样把它们依次地一行一行显示出来。每个字母宽度为一,单词之间需要有空格,宽度也为一。一个单词不可以成两部分显示在两行。如果单词最后一个字母来到行末,直接换行,不用空格。  给定窗口最大高度......
  • [JOISC 2016] 雇佣计划 题解
    [JOISC2016]雇佣计划题解这里补充一篇自己的\(n\logn\)做法。本蒟蒻打了两棵线段树,并且进行了繁琐的分类讨论,完全被标算的树状数组吊打qwq题意:给定一个序列\(a\),有两种操作:将\(c\)位置权值改为\(d\);给定一个权值\(b\),定义集合\(S=\{i|a_i\geb\}\),对于......
  • [ABC319G] Counting Shortest Paths
    [ABC319G]CountingShortestPathsAtcoder:[ABC319G]CountingShortestPaths洛谷:[ABC319G]CountingShortestPathsProblem经典问题:求补图的最短路,边权均为\(1\),并顺带求出\(1\ton\)最短路的数量。\(n\le2\times10^5\)。Solution每次从队列中把最早遍历到的节点......
  • P8029 [COCI2021-2022#3] Akcija 题解
    注:这篇题解中涉及到的所有概念均会在其第一次出现时用斜体标出,有些概念给出了定义,而有些概念的含义请自行意会。定义状态为选了的物品数\(a\)与相应总价格\(b\)的二元组\((a,b)\)。相应地定义状态之间的大小关系、最优状态与状态和状态的加法运算\((a_1,b_1)+(a_2,b......
  • UVA1030 题解
    思路分析猜想我们可以在题目中看出一下几个突破口:能“看穿”的位置所对应的单位立方体是一定不存在的。如果前视图的右上角的颜色\(A\)和顶视图的的右下角颜色\(B\)不同,那么对应的格子就一定不存在。在删除这个立方体后,我们还可以发现,挖去立方体的左侧和\(B\)左侧的......
  • CF431B 题解
    思路分析答题思路一道纯暴力题!因为我们发现数据最大是\(5\),而枚举全排列的时间复杂度为\(\mathcalO(n!)\),对于这种极小的数据范围是丝毫不用顾虑的,因为我们只需要执行\(120\)次。如何快速求出一个数组的全排列?我们可以使用dfs,一层一层获取这个数组的全排列。但是STL......
  • CF387B 题解
    思路分析因为最终要使得\(a,b\)相同,所以我们应该希望让相同的数字尽量相同。所以,我们需要先对\(a\)和\(b\)进行排序,这样子就可以使用双指针的方法来维护最终值了。我们定义\(l\)指针指向\(a_l\),\(r\)指针指向\(b_r\)。因为题目要求添加数字的次数最少,所以我们希望尽......
  • P9516 题解
    思路分析一道很有洛谷个性的模拟签到题。按照题意,我们只需读入\(a,b,c,d,e\),然后对其进行求和,然后依次根据洛谷咕值系统介绍进行判断即可。这样是不是太没有意思了?今天为大家带来一点干货作为福利!介绍:accumulate()函数!简略分析:这个函数可以求出一段区间内的数字之和。S......
  • P9517 题解
    思路分析我们只需要找到左边第一个大于\(0\)的位置\(l\)与右边第一个大于\(0\)的位置\(r\),输出\(r-l+1\)即可。但是很坑的一点是,如果\(∀i∈[1,n],a_i=0\),那么\(l\)和\(r\)会重合,代码会输出\(1\)!所以,我们需要定义一个\(flag\)来标记是否全部输入为\(0\)。代......