UVA 10869 - Brownie Points II(树阵)
UVA 10869 - Brownie Points II
题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线。然后还有一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分出4个象限,第一个人得到分数为1。3象限,第二个人为二四象限。问第一个个人按最优取法,能得到最小分数的最大值,和这个值下还有一个人的得分可能情况
思路:树状数组,能够枚举一点,假设能求出右上和左下点的个数就好办了,其有用一个树状数组,把y坐标离散化掉,然后记录进来,然后把点按x从左往右,每次删掉点后查询当前高度向上的点的个数,这样就能得到右上角点的个数,同理也能求左下角,能处理这步就好办了。最后注意答案要取重而且递增,用set就ok了
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std; #define lowbit(x) (x&(-x)) const int N = 200005; struct Point {
int x, y, rank, ans, Mi;
int xn, yn;
} p[N]; int bit[N];
set<int> out; void add(int x, int v) {
while (x < N) {
bit[x] += v;
x += lowbit(x);
}
} int get(int x) {
int ans = 0;
while (x > 0) {
ans += bit[x];
x -= lowbit(x);
}
return ans;
} int get(int l, int r) {
return get(r) - get(l - 1);
} bool cmpy(Point a, Point b) {
return a.y < b.y;
} bool cmpx(Point a, Point b) {
if (a.x == b.x) return a.y > b.y;
return a.x < b.x;
} bool cmpx2(Point a, Point b) {
if (a.x == b.x) return a.y < b.y;
return a.x > b.x;
} int n, top; void init() {
memset(bit, 0, sizeof(bit));
for (int i = 0; i < n; i++) {
scanf("%d%d", &p[i].x, &p[i].y);
p[i].ans = 0;
p[i].xn = p[i].yn = 0;
}
sort(p, p + n, cmpy);
} void solve() {
top = 1;
for (int i = 0; i < n; i++) {
if (i && p[i].y != p[i - 1].y)
top++;
p[i].rank = top;
add(p[i].rank, 1);
}
for (int i = 0; i < n; i++) {
int j;
int len = 0;
for (j = i; p[i].y == p[j].y && j < n; j++)
len++;
for (j = i; p[i].y == p[j].y && j < n; j++)
p[j].yn = len;
i = j - 1;
}
sort(p, p + n, cmpx);
for (int i = 0; i < n; i++) {
add(p[i].rank, -1);
p[i].ans += get(p[i].rank + 1, top);
}
for (int i = 0; i < n; i++) {
int j;
int len = 0;
for (j = i; p[i].x == p[j].x && j < n; j++)
len++;
for (j = i; p[i].x == p[j].x && j < n; j++)
p[j].xn = len;
i = j - 1;
}
memset(bit, 0, sizeof(bit));
for (int i = 0; i < n; i++)
add(p[i].rank, 1);
sort(p, p + n, cmpx2);
for (int i = 0; i < n; i++) {
add(p[i].rank, -1);
p[i].ans += get(1, p[i].rank - 1);
}
for (int i = 0; i < n; i++) {
int j;
int Min = 1000000000;
for (j = i; p[i].x == p[j].x && j < n; j++)
Min = min(Min, p[j].ans);
for (j = i; p[i].x == p[j].x && j < n; j++)
p[j].Mi = Min;
i = j - 1;
}
int Max = 0;
out.clear();
for (int i = 0; i < n; i++) {
if (p[i].Mi != p[i].ans) continue;
if (p[i].ans > Max) {
Max = p[i].ans;
out.clear();
out.insert(n - p[i].ans - p[i].xn - p[i].yn + 1);
}
else if (p[i].ans == Max) {
out.insert(n - p[i].ans - p[i].xn - p[i].yn + 1);
}
}
printf("Stan: %d; Ollie:", Max);
for (set<int>::iterator it = out.begin(); it != out.end(); it++)
printf(" %d", *it);
printf(";\n");
} int main() {
while (~scanf("%d", &n) && n) {
init();
solve();
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
UVA 10869 - Brownie Points II(树阵)的更多相关文章
- POJ 2464 Brownie Points II --树状数组
题意: 有点迷.有一些点,Stan先选择某个点,经过这个点画一条竖线,Ollie选择一个经过这条直接的点画一条横线.Stan选这两条直线分成的左下和右上部分的点,Ollie选左上和右下部分的点.Sta ...
- UVA10869 - Brownie Points II(线段树)
UVA10869 - Brownie Points II(线段树) 题目链接 题目大意:平面上有n个点,Stan和Ollie在玩游戏,游戏规则是:Stan先画一条竖直的线作为y轴,条件是必需要经过这个 ...
- hdu 1156 && poj 2464 Brownie Points II (BIT)
2464 -- Brownie Points II Problem - 1156 hdu分类线段树的题.题意是,给出一堆点的位置,stan和ollie玩游戏,stan通过其中一个点画垂线,ollie通 ...
- HDOJ 5147 Sequence II 树阵
树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others) ...
- Day6 - E - Brownie Points II POJ - 2464
Stan and Ollie play the game of Odd Brownie Points. Some brownie points are located in the plane, at ...
- POJ 2464 Brownie Points II(树状数组)
一开始还以为对于每根竖线,只要与过了任意一点的横线相交都可以呢,这样枚举两条线就要O(n^2),结果发现自己想多了... 其实是每个点画根竖线和横线就好,对于相同竖线统计(一直不包含线上点)右上左下总 ...
- POJ 2464 Brownie Points II (树状数组,难题)
题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个sta ...
- HDOJ-1156 Brownie Points II 线段树/树状数组(模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1156 在一张二位坐标系中,给定n个点的坐标,玩一个划线游戏(线必须穿过点),Stan先手画一条垂直的线,然后Ol ...
- POJ - 2464 Brownie Points II 【树状数组 + 离散化】【好题】
题目链接 http://poj.org/problem?id=2464 题意 在一个二维坐标系上 给出一些点 Stan 先画一条过一点的水平线 Odd 再画一条 过Stan那条水平线上的任一点的垂直线 ...
随机推荐
- linux跟踪线程的方法:LWP和strace命令
摘要:在使用多线程程序时,有时会遇到程序功能异常的情况,而这种异常情况并不是每次都发生,很难模拟出来.这时就需要运用在程序运行时跟踪线程的手段,而linux系统的LWP和strace命令正是这种技术手 ...
- JS生成一个种子随机数(伪随机数)
原文链接:https://geniuspeng.github.io/2016/09/12/js-random/ 最近有一个需求,需要生成一个随机数,但是又不能完全随机,就是说需要一个种子seed,se ...
- Spring Tool Suite(STS)加速
Java开发首选技术是Spring,使用Spring技术首选的开发工具是STS,STS有许多加速spring开发的提示和快捷方式,并将spring的最新技术通过STS快速简单的传递给用户. 但是STS ...
- php求二叉树的深度(1、二叉树就可以递归,因为结构和子结构太相似)(2、谋而后动,算法想清楚,很好过的)
php求二叉树的深度(1.二叉树就可以递归,因为结构和子结构太相似)(2.谋而后动,算法想清楚,很好过的) 一.总结 1.二叉树就可以递归,因为结构和子结构太相似 2.谋而后动,算法想清楚,很好过的 ...
- 第一次使用docker for windows 遇到的坑
原文:第一次使用docker for windows 遇到的坑 1. 目前win10安装docker, 不需要安装其他工具,可直接到官网下载 2. 此版本的docker可同时运行Windows con ...
- 【t010】最近距离
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 聚类方法要求将空间中的点集,按照一点的方式进行归类,要求每一类中的点集相互之间的距离足够的"近 ...
- AE创建拓扑
转自原文 AE创建拓扑 /// <summary> /// 创建拓朴 /// </summary> /// <param name="featureWorksp ...
- .Net Core身份认证:IdentityServer4实现OAuth 2.0 客户端模式 - 简书
原文:.Net Core身份认证:IdentityServer4实现OAuth 2.0 客户端模式 - 简书 一.客户端模式介绍 客户端模式(Client Credentials Grant)是指客户 ...
- Cocos2d-x 3.2 Lua演示样例FontTest(字体測试)
Cocos2d-x 3.2 Lua演示样例FontTest(字体測试) 本篇博客介绍Cocos2d-x 3.2中Lua測试项目中的FontTest样例,主要使用了字体文件来创建我们想要的字体样式: 第 ...
- Linux网络编程——原始套接字编程
原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...