题目大意:
有nn个OI选手,每个人插了一个flag。有一天因为某种原因,flag都被触发了,所以地上有一排nn根竹竿,竹竿的间距均为一个单位长度,高度在1\sim m1∼m之间。
kls看到这些竹竿,感觉不好看,于是准备把它们全部放倒。
在这之前,kls想到了一个数学问题。每根竹竿可以往左倒或者往右倒。如果两根竹竿在选择方向放倒之后,它们的顶端可以重合,那么称它们是优秀的。现在kls想要知道,有多少对竹竿是优秀的。
思路:
很简单了,哈希,map,排序都可以写,因为是为了写一题map来丰富一下我的分类,所以就这么简单了。
程序:
#include<map>
#include<string.h>
#include<cstdio>
#include<cstdlib>
#define LL long long
using namespace std;
map<int,int> a;
int n,m,x;
LL ans;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) {
scanf("%d",&x);
ans+=a[i+x]+a[i-x];
a[i+x]++;
a[i-x]++;
}
printf("%lld",ans);
}