CF1520D Same Differences 题解

Content

给定 \(n\) 个数 \(a_1,a_2,\dots,a_n\),求有多少个二元组 \((i,j)\) 满足:

  • \(i<j\)
  • \(a_j-a_i=j-i\)

数据范围:\(t\) 组数据,\(1\leqslant a_i\leqslant n,\sum n\leqslant 2\times 10^5\)\(1\leqslant t\leqslant 10^4\)

Solution

很简单的一道题目。

我们将题目中的这个等式稍微移项一下就可以得到 \(a_i-i=a_j-j\)。然后这个题目就可以转化了。我们只需要边输入当前的 \(a_i\),边加上 \(a_i-i\) 在前面 \(i-1\) 个数当中出现的次数,更新 \(a_i-i\) 出现的次数即可得到答案。计数器可以用 map 实现。

Code

int a[200007];

int main() {
	MT {
		map<int, int> vis;
		int n = Rint; ll ans = 0;
		F(int, i, 1, n) a[i] = Rint, ans += vis[a[i] - i], vis[a[i] - i]++;
		println(ans);
	}
    return 0;
}
posted @ 2021-12-15 22:07  Eason_AC  阅读(53)  评论(0)    收藏  举报