洛谷P4889kls与flag

第一思路暴搜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万岁!

猜你喜欢

转载自www.cnblogs.com/xuanxixiaohei/p/9785394.html
今日推荐