百度之星初赛第二轮的第一题,题目如下
Problem Description
临近节日,度度熊们最近计划到室外游玩公园,公园内部包括了很多的旅游景点区和休息区,由于旅游景点很热门,导致景点区和休息区都聚集了很多人。所以度度熊在旅游之前想通过百度地图查看一下公园内各个地方的热门程度。 假设所有景点区和休息区都是X轴直线上的一系列顶点,所对应的坐标X i 保证唯一。每个景点区有个初始的热度值,而一个休息区(坐标为X i)的热度值等于离它距离最近的景点区X j的热度值(距离定义为|X i-X j|),如果此休息区与两个景点区的距离一样,则休息区的热度值选择两个景点区中的热度值最大值,如果两个热度值都一样,则随意选择其中一个。 度度熊在出门之前会经常去查看百度地图,每次查看前会有某些景点区的热度值已发生改变,从而也会导致周围的休息区的热度值发生改变,然后度度熊想知道当前热度值<=R k的顶点(包括景点区和休息区)有多少个
Input
输入数据的第一行是测试Case的个数(T<=100)。 每个Case的第一行是N(0<N<=10000),表示景点区和休息区的总数。 接着会有N行数据,每一列首先是顶点的X坐标Xi (0< X i <=1e8),第二列是一个整数H i(0=<H i <=100000),如果H i 不为0,则表示当前顶点为风景区且初始的热度值为H i,否则表示当前顶点为休息区。这N行数据会按照坐标Xi递增的方式依次给出。 接着的一行数据是操作的次数K(K<=100),最后会有K行数据,每一行的第一列要么是’U’或者’Q’,’U’表示当前操作为更改热度操作,’Q’表示当前操作为查询操作。如果是更改操作,接着会有两列数据,分别是热度值要改变的风景区的下标L k(0<=L k<N)以及改变后的热度值V k(0< V k<=100000);如果是查询操作,第二列是要查询的热度范围R k(0< R k<=100000)
Output
对于第k组测试数据,第一行输出Case #k:,接下来对每次查询操作(即Q操作)会输出一个整数,表示满足条件的顶点数有多少个
Sample Input
1 4 10 0 20 3 30 0 40 2 3 Q 3 U 3 4 Q 3
Sample Output
Case #1: 4 2
#include <iostream>
#include <vector>
using namespace std;
vector<long> vx;
vector<int> vh;
int main()
{
//标志位,如果第一个是休息区,则取其后的景点热点值
int T, N, K;
int vxt;
long vht;
char vkt;
int k1, k2, r1;
cin >> T;
while (T--)
{
int m = 1;
cin >> N;
while (N--)
{
cin >> vxt >> vht;
vx.push_back(vxt);
vh.push_back(vht);
}//至此已录入xi和hi
cin >> K;
for (int i = 1; i <= K;i++)
{
cin >> vkt;
int count = 0;
if (vkt == 'Q')//查询操作 第三列为空 用-1补齐
{
cin >> r1;//要查询的热度范围,接下来要遍历所有区域。判断其值。
vector<long>::iterator iterx = vx.begin();
for (vector<int>::iterator iterh = vh.begin() ; iterh != vh.end(); iterh++,iterx++)
{
if (*iterh != 0)//表示当前坐标为景点。
{
if (*iterh <= r1)//判断当前热度是否小于等于输入热度如果是 count++;
{
count++;
}
}
else//当前坐标为休息区,该判断其热度值了。
{
if (iterh==vh.begin ()||(iterh==vh.end()-1))//判断是否处在首或尾
{
if (iterh == vh.begin())
{
if (*(iterh + 1) <= r1)
count++;
}
else
{
if (*(iterh - 1) <= r1)
count++;
}
}
else
{
if (*(iterx + 1) > (*(iterx - 1)))
{
//要大的值作为当前热度值 要和输入的做判断
if (*(iterh + 1) <= r1)
count++;
}
else if (*(iterx + 1) < (*(iterx - 1)))
{
//要大的值作为当前热度值 要和输入的做判断
if (*(iterh - 1) <= r1)
count++;
}
else
{
//要随便一个的值作为当前热度值 要和输入的做判断
if (*(iterh - 1) <= r1)
count++;
}
}
}
}
if (m == 1)
{
std::cout << "Case #" << i << ":" << endl;
m = 0;
}
std::cout<< count << endl;
}
else//更改操作
{
cin >> k1 >> k2;//热度值要改变的风景区下标和改变后热度值
vh[k1] = k2;
}
}
}
return 0;
}