poj2464扫描线好题,树状数组解法
用树状数组解比线段树快了好多,难度也下降许多
分别用两个树状数组维护当前扫描线左侧和右侧的点,离散化y轴即可
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 200005
struct node{
int x,y;
bool operator<(const node p)const {
return x<p.x;
}
}p[maxn];
int y[maxn],cnt,n;
int l[maxn],r[maxn];//两个树状数组维护扫描线左边的点数,右边的点数
void add(int *bit,int x,int num){
for(int i=x;i<=cnt+;i+=i&-i)
bit[i]+=num;
}
int sum(int *bit,int x){
int res=;
for(int i=x;i;i-=i&-i)
res+=bit[i];
return res;
} int main(){
while(scanf("%d",&n),n){
memset(l,,sizeof l);
memset(r,,sizeof r);
for(int i=;i<n;i++){
scanf("%d%d",&p[i].x,&p[i].y);
y[i]=p[i].y;
}
sort(p,p+n);sort(y,y+n);
cnt=unique(y,y+n)-y;//离散化y轴
for(int i=;i<n;i++)
add(r,lower_bound(y,y+cnt,p[i].y)-y+,);
int Stan=-,st=;
vector<int>Ollie;
for(int i=;i<=n;i++){
if(i==n || p[i].x!=p[i-].x){//一条竖线上的点统一处理
for(int j=st;j<i;j++)
add(r,lower_bound(y,y+cnt,p[j].y)-y+,-);//把这条线上的点从r数组删去
int stan=-,ollie=-;
for(int j=st;j<i;j++){
int pos=lower_bound(y,y+cnt,p[j].y)-y+;
int a=sum(r,cnt)-sum(r,pos)+sum(l,pos-);
int b=sum(l,cnt)-sum(l,pos)+sum(r,pos-);
if(b==ollie) stan=min(stan,a);//使stan得分最小化
else if(b>ollie) stan=a,ollie=b;//使Ollie得分最大化
}
if(stan>Stan){Stan=stan;Ollie.clear();}//stan得分更新后同时跟新Ollie得分
if(stan==Stan)Ollie.push_back(ollie);
for(int j=st;j<i;j++)//最后把这条线上的点加入l数组
add(l,lower_bound(y,y+cnt,p[j].y)-y+,);
st=i;
}
}
printf("Stan: %d; Ollie:",Stan);
sort(Ollie.begin(), Ollie.end());
cnt=unique(Ollie.begin(), Ollie.end())-Ollie.begin();
for(int i=;i<cnt;i++) printf(" %d",Ollie[i]);
puts(";");
}
return ;
}
poj2464扫描线好题,树状数组解法的更多相关文章
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
- BZOJ 2758 Blinker的噩梦(扫描线+熟练剖分+树状数组)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2758 题意:平面上有n个多边形(凸包和圆).任意两个多边形AB只有两种关系:(1) ...
- [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组
Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...
- 洛谷 P1908 逆序对(树状数组解法)
归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...
- (好题)树状数组+离散化+DFS序+离线/莫队 HDOJ 4358 Boring counting
题目传送门 题意:给你一棵树,树上的每个节点都有树值,给m个查询,问以每个点u为根的子树下有多少种权值恰好出现k次. 分析:首先要对权值离散化,然后要将树形转换为线形,配上图:.然后按照右端点从小到大 ...
- 【42%】【hdu1166】排兵布阵(树状数组解法&&线段树解法)
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- C#LeetCode刷题-树状数组
树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 ...
- 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)
题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...
- uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1
Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...
随机推荐
- Hadoop生态圈-Cloudera Manager扫盲篇
Hadoop生态圈-Cloudera Manager扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讨论CDH.cloueramamager之前,我要问大家几个问题: 1& ...
- 函数和常用模块【day04】:内置函数(八)
一.常用内置函数 1.表格 二.内置函数详情(1-10) 1.abs(x) 功能:取数的绝对值 1 2 >>> abs(-1) #取-1的绝对值 1 2.all(iterable) ...
- 学习windows编程 day1
#include <windows.h> #include <strsafe.h> /* 任务:去掉标题栏和边框 */ //#define LineHeight 15 这是自己 ...
- jedis实现操纵redis的常用api及使用场景
简单记录一下,和描述一下常用的业务场景.好记性不如烂笔头. pom.xml <!--整合redis--> <dependency> <groupId>redis.c ...
- Codeforces 590D Top Secret Task
D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Git与GitHub学习笔记(五)一次提交失败的记录
代码已经跟踪了,添加注释说明,但是总是添加不了 error: pathspec 'live-page'' did not match any file(s) known to git. 重复了好多遍, ...
- 动态规划之Fib数列类问题应用
一,问题描述 有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶或者3阶.走到N阶楼梯,一共有多少种走法? 二,问题分析 DP之自顶向下分析方式: 爬到第N阶楼梯,一共只有三种情况(全划分,加法原 ...
- bzoj 1724 优先队列 切割木板
倒着的石子合并,注意不是取当前最长木板贪心做,而是取当前最小累加答案: 例如 4 5 6 7 若按第一种思路:ans=22+15+9 第二种:ans=22+13+9,可以先从中间某一块分开,这样答案更 ...
- # 20155214 2016-2017-2 《Java程序设计》第8周学习总结
20155214 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 对于串流输入/输出使用inputStream/OutputStream来衔接数据源与目的地, ...
- MySQL事务隔离级别以及验证
事务的并发执行,容易出现的几个现象 -------------------------- 1.脏读 读未提交,一个事务读取了另外一个事务改写还没有提交的数据,如果另外一个 ...