第一思路暴搜30
1 int n,m,h[300000],ans; 2 int main() 3 { 4 int i,j; 5 cin>>n>>m; 6 for(i=1;i<=n;i++) 7 cin>>h[i]; 8 for(i=1;i<=n-1;i++) 9 for(j=i+1;j<=n;j++) 10 if(h[i]+h[j]==j-i||h[i]-h[j]==j-i||h[j]-h[i]==j-i) 11 ans++; 12 cout<<ans<<endl; 13 return 0; 14 }
O(N^2)70超时
思路优化
运用了不用map的方法
即把每个杆子可能落到的位置存进数组
运用sort排序一遍
O(N)扫一遍即可
#include<bits/stdc++.h> using namespace std; long long p[400004]; int main() { long long n,m,h,i,j,e=0,t=0,ans=0; cin>>n>>m; for(i=1;i<=n;i++) { cin>>h; e+=2; p[e-1]=i-h; p[e]=i+h; } sort(p+1,p+e+1); for(i=1;i<=2*n;i++) if(p[i]!=p[i-1]) t=0; else{ t++; ans+=t; } cout<<ans<<endl; return 0; }
AC万岁!
原文:https://www.cnblogs.com/xuanxixiaohei/p/9785394.html