Re0(单调栈)

来源:互联网 发布:维多利亚2 mac 中文 编辑:程序博客网 时间:2024/05/05 04:07

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;        }    }}
原创粉丝点击