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
 

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

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

 /* ***********************************************
Author :kuangbin
Created Time :2014/5/25 14:22:19
File Name :E:\2014ACM\比赛\百度之星初赛2\A.cpp
************************************************ */ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std; const int MAXN = ;
long long c[MAXN];
int lowbit(int x)
{
return x&(-x);
}
long long sum(int i)
{
long long ret = ;
while(i > )
{
ret += c[i];
i -= lowbit(i);
}
return ret;
}
void add(int i,long long val)
{
while(i <= )
{
c[i] += val;
i += lowbit(i);
}
} int s1[MAXN];
int s2[MAXN];
int sz1,sz2; vector<int>vec1[];
vector<int>vec2[];
int a[];
int b[]; void calc(int u)
{
int id = lower_bound(s1,s1+sz1,s2[u]) - s1;
if(id == )
{
vec1[].push_back(u);
vec2[u].push_back();
}
else if(id == sz1)
{
vec1[sz1-].push_back(u);
vec2[u].push_back(sz1-);
}
else
{
if(s2[u] - s1[id-] < s1[id] - s2[u] )
{
vec1[id-].push_back(u);
vec2[u].push_back(id-);
}
else if(s2[u] - s1[id-] > s1[id] - s2[u])
{
vec1[id].push_back(u);
vec2[u].push_back(id);
}
else
{
vec1[id-].push_back(u);
vec2[u].push_back(id-);
vec1[id].push_back(u);
vec2[u].push_back(id);
}
}
}
int get(int u)
{
if(vec2[u].size() == )
{
return a[vec2[u][]];
}
else
{
return max(a[vec2[u][]],a[vec2[u][]]);
}
} int link[]; int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
int iCase = ;
int n;
scanf("%d",&T);
while(T--)
{
iCase++;
printf("Case #%d:\n",iCase);
sz1 = ;sz2 = ;
memset(c,,sizeof(c));
int u,v;
scanf("%d",&n);
for(int i = ;i < n;i++)
{
scanf("%d%d",&u,&v);
if(v == )
s2[sz2++] = u;
else
{
s1[sz1++] = u;
link[i] = sz1-;
add(v,);
a[sz1-] = v;
}
vec1[i].clear();
vec2[i].clear();
}
for(int i = ;i < sz2;i++)
calc(i);
for(int i = ;i < sz2;i++)
{
b[i] = get(i);
add(b[i],);
}
char op[];
int m;
scanf("%d",&m);
while(m--)
{
scanf("%s",op);
if(op[] == 'Q')
{
scanf("%d",&u);
printf("%d\n",(int)sum(u));
}
else
{
scanf("%d%d",&u,&v);
u = link[u];
add(a[u],-);
a[u] = v;
add(a[u],);
for(int i = ;i < vec1[u].size();i++)
{
int p = get(vec1[u][i]);
add(b[vec1[u][i]],-);
b[vec1[u][i]] = p;
add(p,);
}
}
}
}
return ;
}

HDU 4831 Scenic Popularity的更多相关文章

  1. hdu 4831 Scenic Popularity(模拟)

    pid=4831" style="font-weight:normal">题目链接:hdu 4831 Scenic Popularity 题目大意:略. 解题思路: ...

  2. HDU 4831 Scenic Popularity (段树)

    Scenic Popularity Problem Description 临近节日,度度熊们近期计划到室外游玩公园.公园内部包含了非常多的旅游景点区和歇息区,因为旅游景点非常热门,导致景点区和歇息区 ...

  3. 2014百度之星初赛第二场hdu 4831 Scenic Popularity

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. hdu4831 Scenic Popularity(线段树)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4831 题目大概意思就是有多个风景区和休息区,每个风景区有热度,休息区的热度与最接近的分景区的热度相同, ...

  5. hdu 4831

    写了一个小时题目看错了,艹 自己百度吧

  6. 百度之星A

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. ACM 未解决的问题

    还没有搞定的ACM问题列表. google code jam Round1A Round1B Round1C Round2 Round3 Onsite Finals 百度之星 一.资格赛题目: dis ...

  8. (KMP 水)Wow! Such Doge! -- hdu -- 4847

    http://acm.hdu.edu.cn/showproblem.php?pid=4847 Wow! Such Doge! Time Limit:1000MS     Memory Limit:32 ...

  9. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. Stanford CS1 Compilers PA2J notes

    [题记·碎碎念] 斯坦福这门Compilers原本放在Coursera上,当年错过档期很是可惜,后来发现他们自己的MOOC站放了一个self paced版本,真是普大喜奔,趁着放假有空学学. 这门课的 ...

  2. Redis 配置文件详解

    # Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写)## 1k => 1000 bytes# 1kb => ...

  3. GitHub 上排名前 100 的 Objective-C 项目简介

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况.   项目名称 项目信息 1. AFNetworking ...

  4. tr:even 与tr:odd

    :even匹配所有索引值为偶数的元素,从 0 开始计数查找表格的1.3.5...行(即索引值0.2.4...)<table> <tr><td>Header 1< ...

  5. Android test---JUnit

    JUnit 单元测试 Android的单元测试基础也是比较简单,同样还是测试相加方法是否正确,测试用例还是用1+1?=2来个简单的Android单元测试: 1..打开eclipse,新建一个proje ...

  6. canvas内容

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. python中的内存管理

    不像大多数编译型语言,变量必须在使用之前声明名字和类型,在python中,变量在第一次被赋值时自动声明.在变量创建时,python解释器会根据语法和右侧的操作数来决定新对象的类型,在对象创建后,一个该 ...

  8. IP地址划分

    对于32位的IPV4地址来说,有5中IP地址类型 A类IP地址第一个字节是网络地址,后三个字节是主机地址,且最高位以0开头. 0000001  00000000   00000000 00000001 ...

  9. JAVA学习笔记(1-32)

    1:数据的输入中,也需要提前声明变量.java区分大小写,注意保留字的问题,注意分号. 2:用import调用一个类.用new新建一个对象,相当于c中的malloc. 3:用final定义一个宏,相当 ...

  10. 自己实现多线程的socket,socketserver源码剖析

    1,IO多路复用 三种多路复用的机制:select.poll.epoll 用的多的两个:select和epoll 简单的说就是:1,select和poll所有平台都支持,epoll只有linux支持2 ...