2014百度之星初赛(第二场)——Scenic Popularity

2014百度之星初赛(第二场)——Scenic Popularity

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
 

Source
 
AC代码:
直接暴力破解;PS:cin读入会超时and貌似就会这一题啊抓狂
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define MAX 10005

using namespace std;

typedef struct Node
{
	int x;
	int h;
	int flag;
}Node;

void Work(Node Area[],int n)
{
	int i;
	int mindis;
	int maxheat;
	for(i=0;i<n;i++)
	{
		mindis=100000005;
		maxheat=0;
		if(Area[i].flag==1)
		{
			for(int j=i+1;j<n;j++)
			{
				if(Area[j].flag==0)
				{
					mindis=Area[j].x-Area[i].x;
					maxheat=Area[j].h;
					break;
				}
			}
			for(int k=i-1;k>=0;k--)
			{
				if(Area[k].flag==0)
				{
					if(Area[i].x-Area[k].x<mindis)
						maxheat=Area[k].h;
					else if(Area[i].x-Area[k].x==mindis)
						maxheat=max(maxheat,Area[k].h);
					break;
				}
			}
			Area[i].h=maxheat;
		}
	}
}

void Update(Node Area[],int n,int l,int k)
{
	Area[l].h=k;
	Work(Area,n);
}

void Query(Node Area[],int n,int r)
{
	int ans=0;
	for(int i=0;i<n;i++)
	{
		if(Area[i].h<=r)
			ans++;
	}
	printf("%d\n",ans);
}

int main(int argc,char *argv[])
{
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++)
	{
		printf("Case #%d:\n",i);
		Node Area[MAX];
		int n,k;
		scanf("%d",&n);
		for(int j=0;j<n;j++)
		{
			scanf("%d%d",&Area[j].x,&Area[j].h);
			if(Area[j].h==0)
				Area[j].flag=1;
			else
				Area[j].flag=0;
		}
		Work(Area,n);
		scanf("%d",&k);
		while(k--)
		{
			char op[2];
			scanf("%s",op);
			if(op[0]=='Q')
			{
				int r;
				scanf("%d",&r);
				Query(Area,n,r);
			}
			else
			{
				int l,v;
				scanf("%d%d",&l,&v);
				Update(Area,n,l,v);
			}
		}
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值