HDU 4831 Scenic Popularity

Scenic Popularity


Time Limit: 2000/1000 MS
(Java/Others)    Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 117    Accepted
Submission(s): 25

Problem Description

  临近节日,度度熊们最近计划到室外游玩公园,公园内部包括了很多的旅游景点区和休息区,由于旅游景点很热门,导致景点区和休息区都聚集了很多人。所以度度熊在旅游之前想通过百度地图查看一下公园内各个地方的热门程度。
  假设所有景点区和休息区都是X轴直线上的一系列顶点,所对应的坐标Xi 保证唯一。每个景点区有个初始的热度值,而一个休息区(坐标为Xi)的热度值等于离它距离最近的景点区Xj的热度值(距离定义为|Xi-Xj|),如果此休息区与两个景点区的距离一样,则休息区的热度值选择两个景点区中的热度值最大值,如果两个热度值都一样,则随意选择其中一个。
  度度熊在出门之前会经常去查看百度地图,每次查看前会有某些景点区的热度值已发生改变,从而也会导致周围的休息区的热度值发生改变,然后度度熊想知道当前热度值<=Rk的顶点(包括景点区和休息区)有多少个

Input

  输入数据的第一行是测试Case的个数(T<=100)。
  每个Case的第一行是N(0<N<=10000),表示景点区和休息区的总数。
  接着会有N行数据,每一列首先是顶点的X坐标Xi
(0<
Xi <=1e8),第二列是一个整数Hi(0=<Hi <=100000),如果Hi 不为0,则表示当前顶点为风景区且初始的热度值为Hi,否则表示当前顶点为休息区。这N行数据会按照坐标Xi递增的方式依次给出。
  接着的一行数据是操作的次数K(K<=100),最后会有K行数据,每一行的第一列要么是’U’或者’Q’,’U’表示当前操作为更改热度操作,’Q’表示当前操作为查询操作。如果是更改操作,接着会有两列数据,分别是热度值要改变的风景区的下标Lk(0<=Lk<N)以及改变后的热度值Vk(0<
Vk<=100000);如果是查询操作,第二列是要查询的热度范围Rk(0<
Rk<=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

2014年百度之星程序设计大赛
- 初赛(第二轮)

我的做法就是在修改的时候,暴力修改和这个点相关的。

找出景点会影响哪些休息区,然后修改的时候暴力,查询的时候树状数组求前n项和


  1 /* ***********************************************
2 Author :kuangbin
3 Created Time :2014/5/25 14:22:19
4 File Name :E:\2014ACM\比赛\百度之星初赛2\A.cpp
5 ************************************************ */
6
7 #include <stdio.h>
8 #include <string.h>
9 #include <iostream>
10 #include <algorithm>
11 #include <vector>
12 #include <queue>
13 #include <set>
14 #include <map>
15 #include <string>
16 #include <math.h>
17 #include <stdlib.h>
18 #include <time.h>
19 using namespace std;
20
21 const int MAXN = 100010;
22 long long c[MAXN];
23 int lowbit(int x)
24 {
25 return x&(-x);
26 }
27 long long sum(int i)
28 {
29 long long ret = 0;
30 while(i > 0)
31 {
32 ret += c[i];
33 i -= lowbit(i);
34 }
35 return ret;
36 }
37 void add(int i,long long val)
38 {
39 while(i <= 100000)
40 {
41 c[i] += val;
42 i += lowbit(i);
43 }
44 }
45
46 int s1[MAXN];
47 int s2[MAXN];
48 int sz1,sz2;
49
50 vector<int>vec1[10010];
51 vector<int>vec2[10010];
52 int a[10010];
53 int b[10010];
54
55 void calc(int u)
56 {
57 int id = lower_bound(s1,s1+sz1,s2[u]) - s1;
58 if(id == 0)
59 {
60 vec1[0].push_back(u);
61 vec2[u].push_back(0);
62 }
63 else if(id == sz1)
64 {
65 vec1[sz1-1].push_back(u);
66 vec2[u].push_back(sz1-1);
67 }
68 else
69 {
70 if(s2[u] - s1[id-1] < s1[id] - s2[u] )
71 {
72 vec1[id-1].push_back(u);
73 vec2[u].push_back(id-1);
74 }
75 else if(s2[u] - s1[id-1] > s1[id] - s2[u])
76 {
77 vec1[id].push_back(u);
78 vec2[u].push_back(id);
79 }
80 else
81 {
82 vec1[id-1].push_back(u);
83 vec2[u].push_back(id-1);
84 vec1[id].push_back(u);
85 vec2[u].push_back(id);
86 }
87 }
88 }
89 int get(int u)
90 {
91 if(vec2[u].size() == 1)
92 {
93 return a[vec2[u][0]];
94 }
95 else
96 {
97 return max(a[vec2[u][0]],a[vec2[u][1]]);
98 }
99 }
100
101 int link[10010];
102
103 int main()
104 {
105 //freopen("in.txt","r",stdin);
106 //freopen("out.txt","w",stdout);
107 int T;
108 int iCase = 0;
109 int n;
110 scanf("%d",&T);
111 while(T--)
112 {
113 iCase++;
114 printf("Case #%d:\n",iCase);
115 sz1 = 0;sz2 = 0;
116 memset(c,0,sizeof(c));
117 int u,v;
118 scanf("%d",&n);
119 for(int i = 0;i < n;i++)
120 {
121 scanf("%d%d",&u,&v);
122 if(v == 0)
123 s2[sz2++] = u;
124 else
125 {
126 s1[sz1++] = u;
127 link[i] = sz1-1;
128 add(v,1);
129 a[sz1-1] = v;
130 }
131 vec1[i].clear();
132 vec2[i].clear();
133 }
134 for(int i = 0;i < sz2;i++)
135 calc(i);
136 for(int i = 0;i < sz2;i++)
137 {
138 b[i] = get(i);
139 add(b[i],1);
140 }
141 char op[10];
142 int m;
143 scanf("%d",&m);
144 while(m--)
145 {
146 scanf("%s",op);
147 if(op[0] == ‘Q‘)
148 {
149 scanf("%d",&u);
150 printf("%d\n",(int)sum(u));
151 }
152 else
153 {
154 scanf("%d%d",&u,&v);
155 u = link[u];
156 add(a[u],-1);
157 a[u] = v;
158 add(a[u],1);
159 for(int i = 0;i < vec1[u].size();i++)
160 {
161 int p = get(vec1[u][i]);
162 add(b[vec1[u][i]],-1);
163 b[vec1[u][i]] = p;
164 add(p,1);
165 }
166 }
167 }
168 }
169 return 0;
170 }

HDU 4831 Scenic Popularity,布布扣,bubuko.com

时间: 2025-01-20 00:12:04

HDU 4831 Scenic Popularity的相关文章

HDU 4831 Scenic Popularity 暴力模拟

Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 340    Accepted Submission(s): 110 Problem Description 临近节日,度度熊们最近计划到室外游玩公园,公园内部包括了很多的旅游景点区和休息区,由于旅游景点很热门,导致景点区和休息区都聚集了很多人.所以度度熊

hdu 4831 Scenic Popularity(模拟)

题目链接:hdu 4831 Scenic Popularity 题目大意:略. 解题思路:对于休闲区g[i][0]和g[i][1]记录的是最近的两个景点的id(只有一个最近的话g[i][1]为0),对于景点来说,g[i][0]为-1(表示该id对应的是景点),g[i][1]为该景点的热度值.主要就是模拟,注意一些细节就可以了. #include <cstdio> #include <cstring> #include <cstdlib> #include <alg

hdu4831 Scenic Popularity(线段树)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4831 题目大概意思就是有多个风景区和休息区,每个风景区有热度,休息区的热度与最接近的分景区的热度相同,题目要求求出小于等于给定热度值的风景区和休息区的个数.显然如果直接暴力的话,复杂度为O(TKN),达到10^9次方数量级,复杂度过高,对于这种问答的题目,最一般的思路其实是线段树,线段树更改和查询的时间复杂度均为O(logn),所以如果用线段树的话,这道题目的复杂度为O(TKlogH),达到10^5

HDU 4831

这是百度之星初赛的题目.当时我是报名了百度之星的,但是因为要出去比赛,所以就错过了预赛,之后也一直没有关注. 但是昨天,我无意之间看见了百度之星,就想试一下.可是这一做不要紧,忽然发现自己什么都不会了. 4道题一道也做不出来.于是今天我决定好好做一下. 这道题是一道典型的线段树的题.题目就是说,有一些景点和休息区,景点有一个热度,休息区的热度等于最近的景点的热度,距离一样就取最大值. 接着是更新,U a b, 下标为a的景点热度更新为b, Q a 所有的景点和休息区中,热度小于等于a的有多少个.

百度之星2014初赛第二场

A. Scenic Popularity http://acm.hdu.edu.cn/showproblem.php?pid=4831 思路:景点区会控制休息区的Hot值,我们建立休息区到它最近的景点区的关系,注意处理冲突. 查询和修改都暴力进行,预处理关系,从左到右,然后从右到左遍历一遍即可,更新时候,从被修改的p位置,向两边,与p有关的休息区进行更新.总的时间复杂度O(T*n*K),10^8左右,不到1s可以解决. const int maxn = 10000; const int maxh

【百度之星2014~初赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛解题报告]>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=671 前言 最近要毕业了,有半年没做比赛了.这次参加百度

百度之星A

Scenic PopularityTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 96    Accepted Submission(s): 17 Problem Description 临近节日,度度熊们最近计划到室外游玩公园,公园内部包括了很多的旅游景点区和休息区,由于旅游景点很热门,导致景点区和休息区都聚集了很多人.所以度度熊在旅

ACM 未解决的问题

还没有搞定的ACM问题列表. google code jam Round1A Round1B Round1C Round2 Round3 Onsite Finals 百度之星 一.资格赛题目: disk_schedule labyrinth xor_sum Energy Conversion 二.初赛第一轮题目: grids CycleCocycle information party 三.初赛第二轮题目: Scenic Popularity JZP Set

模拟-hdoj-4831-百度之星2014初赛第二场

Scenic Popularity Problem Description 临近节日,度度熊们最近计划到室外游玩公园,公园内部包括了很多的旅游景点区和休息区,由于旅游景点很热门,导致景点区和休息区都聚集了很多人.所以度度熊在旅游之前想通过百度地图查看一下公园内各个地方的热门程度. 假设所有景点区和休息区都是X轴直线上的一系列顶点,所对应的坐标Xi 保证唯一.每个景点区有个初始的热度值,而一个休息区(坐标为Xi)的热度值等于离它距离最近的景点区Xj的热度值(距离定义为|Xi-Xj|),如果此休息区