Re0(单调栈)

Think:
因为要满足题意,所以优先 采用单调栈来进行解题。 这是春节的题目 2333, 然后半年过去了, 才写解题报告(手动滑稽)。
我的思路就是 建立结构体来储存 威胁数, 然后利用单调栈的特性来进行计算 威胁数, 进而储存。 输出时,输出相对应的a[key].cnt值即可~~

主要坑点:战力相同的情况要忽略, 反正 我 WA了3发都是这个原因

Problem Description

这里写图片描述

Re0 虽然是老套的穿越剧情,但是却有着虐男主 (486) 的新奇点子。作为 2016 最火的番,我们来统计一下其中每个人能看到的对手的人数吧。
对于当前的人,他只能看见战力从他依次增高的一个阶梯。譬如说对于战力分别为 6, 5, 1, 2, 3, 4, 0 的一个分布来说,第一个向前看去看到的对手人数为 0,第二个向前看去能看到战力为 6 的人,看到的对手人数为 1,第三个向前看去能看到战力为 6, 5 的 2 人,第四个向前看去能看到战力为 6, 5 的 2 人,第五个向前看去能看到战力为 6, 5 的 2 人,第六个向前看去能看到战力为 6, 5 的 2 人,第七个向前看去能看到战力为 4, 5, 6 的 3 人。而战力为 1, 2, 3 的人会被战力为 4 的人所屏蔽掉。
Input

输入数据有多组(数据组数不超过 20),到 EOF 结束。
对于每组数据:
第一行输入一个整数 n, m 表示要统计的总人数和询问的次数。
接下来一行有 n 个以空格分隔的正整数,表示 n 个人的战力分布。
接下来 m 行,每行一个正整数 pos,表示要询问的人的位置,位置标号按照输入从 1~n。
数据范围:1 <= n, m <= 100000,战力范围为 1~1000。
Output

对于每组数据中的每次询问,输出一个正整数表示此人向前看去能够看到的对手(威胁)数。
Example Input

7 7
6 5 1 2 3 4 0
1
2
3
4
5
6
7
Example Output

0
1
2
2
2
2
3

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int cnt;
} a[1008611];
int main()
{
    int n, hi, i;
    int m;
    while(cin >> n >> m)
    {
        stack<int>s;
//        scanf("%d",&hi);
//        s.push(hi);
        for (i = 1; i <= n; i ++)
        {
            a[i].cnt = 0;
            scanf("%d",&hi);
            while(!s.empty() && s.top() <= hi)
                s.pop();
            a[i].cnt = a[i].cnt + s.size();
            s.push(hi);
        }
        for (i = 1; i <= m; i ++)
        {
            int key;
            cin >> key;
            cout << a[key].cnt << endl;
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值