首页 > 试题广场 >

谐距下标对

[编程题]谐距下标对
  • 热度指数:11331 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个长度为 n 的整数数组 \{a_1,a_2,\dots,a_n\}。若下标满足 i<ja_j-a_i = j-i,则称 (i,j) 为一对谐距下标对

\hspace{15pt}请计算数组中的谐距下标对数量。

输入描述:
\hspace{15pt}第一行输入整数 n\left(1\leqq n\leqq 10^5\right)
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(1\leqq a_i\leqq 10^5\right)


输出描述:
\hspace{15pt}输出一个整数,表示谐距下标对数量。
示例1

输入

6
1 2 3 4 5 6

输出

15

    async function () {
            const n = parseInt(await readline(), 10);
            const arr = (await readline()).split(/\s+/).map(Number);
            const freq = new Map();
            let count = 0;
            for (let k = 0; k < n; k++) {
                let b = arr[k] - k;
                freq.set(b, (freq.get(b) ?? 0) + 1);
            }
            for (let c of freq.values()) {
                count += (c * (c - 1)) / 2;
            }
            console.log(count);
    }
发表于 2026-03-28 23:28:11 回复(0)