Description
小张在暑假时间进行了暑期社会调查。调查的内容是楼房的颜色如何影响人们的心情。于是他找到了一个楼房从左到右排成一排的小区,这个小区一共有
栋楼房,每个楼房有一个颜色
和一个高度
。小张调查的内容为每次他站在第
栋楼和第
栋楼之间向左看,他记录下此时他看到的楼房颜色数作为他的调查结果。
由于小张在暑假时间沉迷游戏来不及做实地调查,只好拜托你将调查结果告诉他。
Input
本题有多组数据。
每组数据第一行一个整数
。表示有
栋楼房从左到右排成一排。
第二行
个数,表示每个楼房的颜色
。
第三行
个数,表示每个楼房的高度
。
数据保证所有组数据的
。
Output
每组数据输出
个数,第
个数表示他站在第
栋楼和第
栋楼之间向左看,能够看到的楼房颜色数。
Notes
在从左向右看楼房的时候,左边较矮的楼房会被右边较高的楼房挡住。
C++整体代码
#include <iostream>
#include <vector>
#include <stack>
#include <cstdio>
using namespace std;
int main() {
int num;
cin >> num;
stack<int> stack_c, stack_h;
while (num--) {
int n;
cin >> n;
stack_c = stack<int>();
stack_h = stack<int>();
vector<long long> c_class(1000000, 0);
vector<long long> c(n,0), h(n,0);
long long c_num = 0;
//输入楼房颜色
for (int i = 0; i < n; i++) {
scanf("%lld", &c[i]);
}
//输入楼房高度
for (int i = 0; i < n; i++) {
scanf("%lld", &h[i]);
}
//遍历楼房
for (int i = 0; i < n; i++) {
if (stack_h.empty() || h[i] < stack_h.top()) {//如果栈顶为空或者新入栈元素小于栈顶
stack_h.push(h[i]);
stack_c.push(c[i]);
if (++c_class[c[i]] == 1) c_num++;
}
else if (stack_h.top() <= h[i]) {
while (!stack_h.empty() && stack_h.top() <= h[i]) {
if (--c_class[stack_c.top()] == 0) c_num--;
stack_h.pop();
stack_c.pop();
}
stack_h.push(h[i]);
stack_c.push(c[i]);
if (++c_class[c[i]] == 1) c_num++;
}
printf("%lld%c", c_num, i == n - 1 ? '\n' : ' ');
}
}
return 0;
}