题意:N个人按1~N的顺序排成一排,且每个人有一个数字。求满足两个人数字之和 等于 两个人序号差的绝对值。
思路:我们设数字1序号为ai,数字为i.同理数字2为bj和j。 会发现 abs(bj - ai) = j + i。 不妨设ai < aj,移项后发现 ai + i = j - aj。也就是问题转化成了求满足这个式的(ai,aj)对数。那么对于每个数字而言,它作为ai + i 和 j - aj是固定的,我们直接预处理后统计即可。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n; map<ll, ll>One, Two; int main(){ scanf("%d", &n); for(ll i = 1; i <= n; i++){ ll x; scanf("%lld", &x); One[x + i]++; Two[i - x]++; } ll ans = 0; for(auto &Now : One) ans += Two[Now.first] * Now.second; printf("%lld\n", ans); return 0; }
ABC166E This Message Will Self-Destruct in 5s
原文:https://www.cnblogs.com/LYFer233/p/12826204.html