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; } } }