输入描述:
输入中有多组测试数据,每一组测试数据的第一行为一个整数n(3<=n<=10^6),为首都周围的小山数量,第二行为n个整数,依次表示为小山的高度h(1<=h<=10^9).
输出描述:
对每组测试数据,在单独的一行中输出能相互观察到的岗哨的对数。
示例1
输入
5
1 2 4 5 3
输出
7
//超时了,只通过90%
#include<iostream>
using namespace std;
int n,h[1000011],tmp[1000011],rem[1000011];
int Max=0,maxid;
long long cnt=0;
int main()
{
cin>>n;
for(int i=0;i<n;++i)
{
scanf("%d",&tmp[i]);
if(tmp[i]>Max)
{
Max=tmp[i];
maxid=i;
}
}
for(int i=maxid;i<n+maxid;++i)
{
h[i-maxid]=tmp[i%n];
}
h[n]=h[0];
for(int left=1;left<n;++left)
{
int right=left+1;
while(right<=n)
{
if(right==n)
{
rem[left]=1;
}
if(h[right]>h[left])
{
++cnt;
break;
}
if(h[right]==h[left])
{
++cnt;
}
++right;
}
}
for(int right=n-1;right>=0;--right)
{
int left=right-1;
while(left>=0)
{
if(h[left]>h[right])
{
if(left==0&&rem[right])
--cnt;
++cnt;
break;
}
--left;
}
}
cout<<cnt;
return 0;
}