用树状数组解比线段树快了好多,难度也下降许多

分别用两个树状数组维护当前扫描线左侧和右侧的点,离散化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扫描线好题,树状数组解法的更多相关文章

  1. 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询

    题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...

  2. BZOJ 2758 Blinker的噩梦(扫描线+熟练剖分+树状数组)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2758 题意:平面上有n个多边形(凸包和圆).任意两个多边形AB只有两种关系:(1) ...

  3. [bzoj4009] [HNOI2015]接水果 整体二分+扫描线+dfs序+树状数组

    Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The big black, 她觉得这个游戏太简单了,于是发明了一个更 加 ...

  4. 洛谷 P1908 逆序对(树状数组解法)

    归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...

  5. (好题)树状数组+离散化+DFS序+离线/莫队 HDOJ 4358 Boring counting

    题目传送门 题意:给你一棵树,树上的每个节点都有树值,给m个查询,问以每个点u为根的子树下有多少种权值恰好出现k次. 分析:首先要对权值离散化,然后要将树形转换为线形,配上图:.然后按照右端点从小到大 ...

  6. 【42%】【hdu1166】排兵布阵(树状数组解法&&线段树解法)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  7. C#LeetCode刷题-树状数组

    树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 ...

  8. 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)

    题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...

  9. uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1

    Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...

随机推荐

  1. Thrift 安装及使用

    前言:由于最近在看storm Topology提交过程的源代码,写好的topology jar文件是通过Thrift RPC的形式提交给nimbus的.故了解下Thrift的基本原理. 参考:http ...

  2. 在O(N)时间内求解 正数数组中 两个数相加的 最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...

  3. ms sqlserver2008r2 自动备份

    日常工作中利用SQL SQLSERVER 2008 的维护计划对数据库进行定期的备份,这样一方面可以对数据库进行备份保证数据安全另一方面也可以减轻对维护人员的负担. 一般对于WEB 服务器进 行维护都 ...

  4. 【洛谷P2704【NOI2001】】炮兵阵地

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  5. python初步学习-import和datetime模块

    模块 一个完整大型的python程序是由模块和包的形式组织起来的,可见模块在python中的重要性.模块是一种组织型式,它许多有关联(关系)的代码组织放到单独的独立文件中.简单的说,可以把模块理解为一 ...

  6. strong、weak、copy、assign 在命名属性时候怎么用

    一直都在疑惑属性定义中在什么情况下用strong.在什么情况下用weak? 总结大致如下: 1.weak 是用来修饰代理(delegate)和UI控件. 2.strong 是用来修饰除了代理(dele ...

  7. pl/sql Devloper 关键字转为大写

    英文版: peferences-editor-keyword case -uppercase   中文版:

  8. 使用SSH远程登陆Linux

    ⒈SSH介绍 SSH(Secure Shell)由IETF的网络工作小组(NetWork Working Group)所制定,SSH是建立在应用层和传输层基础上的安全协议. SSH是目前较可靠,专为远 ...

  9. Dubbo服务容错(整合hystrix)

    简介:Hystrix旨在通过控制那些访问远程系统.服务和第三方库的节点从而对延迟和故障提供更强大的容错能力,Hystrix具备拥有回退机制和断路器功能的线程和信号隔离.请求缓存和请求打包以及监控和配置 ...

  10. 如何用ModelsimSE仿真IP核-以PLL为例

    我们之前介绍了如何使用Modelsim SE进行仿真和利用do文件的仿真方法,但是其中待仿真的模块是我们自己编写的Verilog模块,但是在实际工作中,我们的设计中会经常用到FPGA厂商给我们提供的现 ...