标签:long 搜索 print int 先来 lld include 没有 接下来
N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。
写一个程序计算出有多少对人可以互相看见。
输入格式:
输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。
接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。
输出格式:
输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。
1 #include<cstdio> 2 using namespace std; 3 int n,top; 4 long long Ans; 5 int a[500050],stk[500050]; 6 void dfs(int x) 7 { 8 int le=0,ri=top,mid,ret=0; 9 while(le<=ri) 10 { 11 mid=(le+ri)>>1; 12 if(a[stk[mid]]>x)ret=mid,le=mid+1; 13 else ri=mid-1; 14 } 15 if(!ret)Ans+=top; 16 else Ans+=top-ret+1; 17 } 18 int main() 19 { 20 scanf("%d",&n); 21 for(int i=1; i<=n; ++i)scanf("%d",&a[i]); 22 for(int i=1; i<=n; ++i) 23 { 24 dfs(a[i]); 25 while(top>0&&a[i]>a[stk[top]])--top; 26 stk[++top]=i; 27 } 28 printf("%lld",Ans); 29 return 0; 30 }
标签:long 搜索 print int 先来 lld include 没有 接下来
原文地址:https://www.cnblogs.com/yufenglin/p/10306366.html