This Message Will Self-Destruct in 5s
传送门
题意:一个数列,要求满足序号差等于值之和的对数。
思路:
A i + A j = i − j A_i+A_j=i-j Ai+Aj=i−j即 A j + j = i − A i A_j+j=i-A_i Aj+j=i−Ai。重点在于两两配对的 O ( n ) O(n) O(n)代码操作。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
typedef long long ll;
ll a[maxn];
map<ll,int>mp;
int main(){
ll n;
scanf("%d",&n);
for(ll i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i>=a[i]) mp[i-a[i]]++;
}
ll ans=0;
for(ll i=1;i<=n;i++){
ans+=mp[a[i]+i];
}
printf("%lld\n",ans);
}