1 条题解

  • 0
    @ 2025-4-5 12:49:42

    可以发现两个点曼哈顿距离=欧几里得距离的充分必要条件是两个点的横坐标相同或者纵坐标相同,再根据不会出现两个同样的点。那么统计每个横坐标和每个纵坐标出现的次数,假设横坐标 ii 出现的次数为 cntxicntx_i,纵坐标 ii 出现的次数为 cntyicnty_i,答案即为

    $$\sum_{i=1}^{\infty}{C_{cntx_i}^{2}} + \sum_{i=1}^{\infty}{C_{cnty_i}^{2}} $$

    统计每个坐标出现的次数可以使用离散化,也可以使用 std::map 等数据结构,时间复杂度为 O(nlogn)O(nlogn)。代码如下:

    using i64 = long long;
    void Solve()
    {
    	int n;	cin >> n;
    	map<int, int> mpx, mpy;
    	for (int i = 0; i < n; i++)
    	{
    		int x, y;
    		cin >> x >> y;
    		mpx[x]++;
    		mpy[y]++;
    	}
    
    	i64 res = 0;
    	for (auto& [u, v] : mpx)
    		res += (i64)v * (v - 1) / 2;
    	
    	for (auto& [u, v] : mpy)
    		res += (i64)v * (v - 1) / 2;
    
    	cout << res << "\n";
    } 
    
    • 1

    信息

    ID
    386
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    81
    已通过
    20
    上传者