题意:
传话游戏,先告诉一个最高的人,然后又最高的人向 左右的 比他矮但是是比他矮的人中最高的 人传话,然后依次输出这人能向左向右传话的位置,关键是找出当前人向左向右的人中比他矮但是是最高的,用单调栈
#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
using namespace std;
const int maxn = 5e5+100;
int a[maxn];
int l[maxn],r[maxn];
int ans = 1;
int main()
{
int t;
cin >> t;
while(t--)
{
stack<int>q,p;///定义两个栈,是为了从左向右 和从右向左一次扫描,这样就不用清栈了
memset(l,0,sizeof(l));///因为多组输入,每次要将记录左端点和右端点的数组清零
memset(r,0,sizeof(r));
int n;
cin >> n;
for(int i =1;i <= n;i++)
cin >> a[i];
for(int i = 1;i <= n;i++)///从左向右遍历,建立单调递减栈,因为要找左边的最高的
{
if(!q.size()) l[i] = 0;
else if(a[i] > a[q.top()])
while(q.size() && a[i] > a[q.top()])
{
l[i] = q.top();///每次都要记录栈的值,以为递增栈,最后一个元素就是最大值
q.pop();///即最后记录的就是左边最高的下标
}
else