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 ...
随机推荐
- ping的作用
Ping是潜水艇人员的专用术语,表示回应的声纳脉冲,在网络中Ping 是一个十分好用的TCP/IP工具.它主要的功能是用来检测网络的连通情况和分析网络速度. Ping有好的善的一面也有恶的一面.先说一 ...
- 20190313 org.apache.commons.lang3.builder.EqualsBuilder的两种典型用法
org.apache.commons.lang3.builder.EqualsBuilder的两种典型用法 public boolean equals(Object obj) { if (obj == ...
- 对于nginx配置文件中的fastcgi_param的配置错误
在centos中搭建LNMP的时候,遇到了一个问题 在浏览器中访问.php文件的时候,nginx不能正常解析,页面返回404,后来百度了一下,发现了问题 在nginx的配置文件nginx.conf中的 ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c
tourselect.c 文件中共有两个函数: selection (population *old_pop, population *new_pop) individual* tournament ...
- 02-MySQL的安装和配置
1. 软件和环境 注:安装MySQL数据库的操作系统必须保证有.NET环境和VC运行库的支持. 下载地址:百度云网盘链接 2. MySQL服务器安装详细步骤 (1). 选择安装类型 这里我们选择 ...
- web4.0基本配置
const path = require('path');//引入路径包 const HWP = require('html-webpack-plugin');//引入自动产出html包 const ...
- indexOf与includes的比较
indexOf和includes都代表检测数组或字符串中是否包含某一个元素 其中indexOf返回的是数值类型,而includes返回的是布尔类型 var ary = [,,]; console.lo ...
- 20155301 2016-2017-2 《Java程序设计》第7周学习总结
20155301 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 1.例如 Compartor<String>byLength=new Compa ...
- JavaScript之原生接口类设计
//接口类 var Interface = function(name , methods){ if(arguments.length!=2){ ...
- SpringBoot在IDEA中实现热部署
gradle构建形式 添加依赖 compile("org.springframework.boot:spring-boot-devtools") 其他设置 步骤1 步骤2 按下 C ...