HDOJ-1156 Brownie Points II 线段树/树状数组(模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1156
在一张二位坐标系中,给定n个点的坐标,玩一个划线游戏(线必须穿过点),Stan先手画一条垂直的线,然后Ollie画一条水平的线(要求要穿过Stan那条线所穿过的某个点)。划分后,左上和右下点数是Ollie 的得分,左下和右上是Stan的得分。求Stan在保证最低得分(即不论Ollie后手怎么划,Stan最少能的的分数)最高,并给出基于符合的先手划法,Ollie后手的各种划线的得分(需要去重),升序输出。
这里可以发现,每次划分等同于枚举以某个点为原点,求一次局面,不同的局面分类到x轴坐标中,每个坐标中的局面集合求最小值,所有x轴坐标分类求最大值即求出了最低最大划法。
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
struct node
{
int x, y;
}p[];
bool cmpx(node a, node b)
{
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
const int N = ;
map<int, int> mpx, mpy;
int st[N];
int tre[N];
int ans[N];
int lowbit(int k)
{
return k&-k;
}
int query(int k)
{
int rec = ;
while (k)
{
rec += tre[k];
k -= lowbit(k);
}
return rec;
}
void add(int k)
{
while (k <= N)
{
tre[k]++;
k += lowbit(k);
}
}
bool cmp(node a, int b)
{
return a.x < b;
}
int main() {
cin.sync_with_stdio(false);
int n;
while (cin>>n)
{
if (n == ) break;
mpx.clear(), mpy.clear();
queue<node> wq;
fill(tre, tre + N, );
fill(ans, ans + N, );
for (int i = ; i < n; i++)
cin >> p[i].x>>p[i].y,mpx[p[i].x]++,mpy[p[i].y]++,st[i]=p[i].y;
sort(st, st + n);
int len = unique(st, st + n) - st;
sort(p, p + n, cmpx); for (int i = ; i < n; i++)
{
while (!wq.empty())
{
node ad = wq.front();
if (ad.x < p[i].x) add(upper_bound(st, st + len, ad.y) - st + ),wq.pop();
else break;
}
int py = upper_bound(st, st + len, p[i].y)-st+;
ans[i] += query(py-);
wq.push(p[i]);
}
while (!wq.empty()) wq.pop();
fill(tre, tre + , );
for (int i = n-; i >= ; i--)
{
while (!wq.empty())
{
node ad = wq.front();
if (ad.x > p[i].x) add(len+st-upper_bound(st, st + len, ad.y) + ),wq.pop();
else break;
}
int py = len + st - upper_bound(st, st + len, p[i].y) + ;
ans[i] += query(py-);
wq.push(p[i]);
}
map<int, int> getMi;
for (int i = ; i < n; i++)
{
if (getMi.find(p[i].x) == getMi.end()) getMi[p[i].x] = ans[i];
else getMi[p[i].x] = min(getMi[p[i].x], ans[i]);
}
map<int, int>::iterator mxit = getMi.end();
for (map<int, int>::iterator it = getMi.begin(); it != getMi.end(); it++)
{
if (mxit == getMi.end())
mxit = it;
else if (mxit->second < it->second)
mxit = it;
}
cout << "Stan: " << mxit->second << "; Ollie:";
set<int> rpy;
for (int i = ; i < n; i++)
if (getMi[p[i].x]==ans[i]&&ans[i] == mxit->second)
rpy.insert(n - ans[i] - mpx[p[i].x] - mpy[p[i].y] + ); for (set<int>::iterator it = rpy.begin(); it != rpy.end(); it++)
{
cout << ' ' << *it;
}
cout << ";" << endl;
}
return ;
}
HDOJ-1156 Brownie Points II 线段树/树状数组(模板)的更多相关文章
- UVA10869 - Brownie Points II(线段树)
UVA10869 - Brownie Points II(线段树) 题目链接 题目大意:平面上有n个点,Stan和Ollie在玩游戏,游戏规则是:Stan先画一条竖直的线作为y轴,条件是必需要经过这个 ...
- UVA 10869 - Brownie Points II(树阵)
UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线.然后还有一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分 ...
- hdu 1156 && poj 2464 Brownie Points II (BIT)
2464 -- Brownie Points II Problem - 1156 hdu分类线段树的题.题意是,给出一堆点的位置,stan和ollie玩游戏,stan通过其中一个点画垂线,ollie通 ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- luogu3368树状数组模板2
题目链接:https://www.luogu.org/problemnew/show/P3368 题意:与模板1不同的是这题的操作是树状数组并不在行的区间更新和单点查找,如果按照模板1那样写肯定会T. ...
- 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- POJ 2464 Brownie Points II(树状数组)
一开始还以为对于每根竖线,只要与过了任意一点的横线相交都可以呢,这样枚举两条线就要O(n^2),结果发现自己想多了... 其实是每个点画根竖线和横线就好,对于相同竖线统计(一直不包含线上点)右上左下总 ...
- POJ 2464 Brownie Points II --树状数组
题意: 有点迷.有一些点,Stan先选择某个点,经过这个点画一条竖线,Ollie选择一个经过这条直接的点画一条横线.Stan选这两条直线分成的左下和右上部分的点,Ollie选左上和右下部分的点.Sta ...
随机推荐
- 《编写高质量代码:Web 前端开发修炼之道》 笔记与读后感
编写高质量代码:Web 前端开发修炼之道/曹刘阳著. —北京:机械工业出版社,2010.5 第一版 涉及到的知识点: 1. CSS Sprites 在国内很多人叫css精灵,是一种网页图片应用处理方式 ...
- tp框架中的一些疑点知识-1
tp默认的编码是utf-8 Runtime中的Cache和Logs都是分模块的,因为在应用app下可以有多个模块,但是 公共模块和Runtime模块只有一个, 所以, Runtime要包含各个模块的内 ...
- Minikube 安装
安装Minikube 在容器编排工具中安装配置最复杂的就是Kubernetes,想要运行一个简单的容器集群环境,对于没有使用过Kubernetes的人来说,需要花费一定的时间去理解各组件的概念和功能, ...
- SpringBoot 消息转换器 HttpMessageConverter
1.简介: Spring在处理请求时,由合适的消息转换器将请求报文绑定为方法中的形参对象,在这里,同一个对象就有可能出现多种不同的消息形式,比如json和xml.同样,当响应请求时,方法的返回值也同样 ...
- how do I get the difference between two R named lists?
aa<- list(a=1, b="two", c=list(3, "four")) bb <- list(a=1, c=list(3, " ...
- 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)
裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...
- Ubuntu 安装 matplotlib
参考: ubuntu16 安装matplotlib Ubuntu 安装 matplotlib sudo apt-get install libpng-dev libfreetype6-dev pkg- ...
- Entity Framework Core导航属性加载问题
前言 今天下午在开发的时候发现EF Core实体模型中的导航属性为 null,经排查既不是没有加 virtual 关键字,也不是外键关系映射错误. 解决方法 通过查询官网文档,发现,原因在于EF Co ...
- FI 业务
f-02 post f-03 clear[account]-> f-04 post with clear fb70/f-22 f-32 clear[account]->f-28 post ...
- HDU 5726 GCD(RMQ+二分)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5726 题意:给出一串数字,现在有多次询问,每次询问输出(l,r)范围内所有数的gcd值,并且输出有多 ...