【题目链接】 http://poj.org/problem?id=3470

【题目大意】

  给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点),
  鸟只会垂直x轴或者y轴飞行,并且会撞上最近的墙,问每面墙最后会有几只鸟撞上去。

【题解】

  我们将所有的二维坐标离散,对xy方向分别进行扫描线,
  以y轴方向为例,我们先从y最小的线开始扫,
  如果是墙,那么在线段树中更新其在x轴上的分布位置
  如果是鸟的坐标,那么在线段树中查找其位置,更新其答案。
  之后从y最大的开始反向扫描,更新,x方向也同理。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
using namespace std;
const int N=50010;
int n,m,wall,tot,dis[N],v[N],w[N],T[10*N],*arr;
int x[3*N],y[3*N],ry[3*N],rx[3*N],r[3*N],xs[3*N],ys[3*N],px[3*N],py[3*N];
bool cmp(int a,int b){return arr[a]<arr[b];}
void compress(int *x,int *r,int n,int *a,int *mp){
for(int i=0;i<n;i++)r[i]=i;
arr=x; sort(r,r+n,cmp);
int m=-1; a[r[0]]=++m; mp[m]=x[r[0]];
for(int i=1;i<n;i++){
int cur=r[i],lst=r[i-1];
if(x[cur]==x[lst])a[cur]=m;
else a[cur]=++m,mp[m]=x[cur];
}
}
int query(int q,int x,int l,int r){
if(T[x]!=-2)return T[x];
int mid=(l+r)>>1;
if(q<mid)return query(q,x<<1|1,l,mid);
return query(q,x+1<<1,mid,r);
}
void update(int a,int b,int x,int l,int r,int val){
if(r<=a||b<=l)return;
else if(a<=l&&r<=b)T[x]=val;
else{
if(T[x]!=-2){
T[x+1<<1]=T[x<<1|1]=T[x];
T[x]=-2;
}int mid=(l+r)>>1;
update(a,b,x<<1|1,l,mid,val);
update(a,b,x+1<<1,mid,r,val);
}
}
void scan(int k,int *ys,int *xs,int *py,int W){
if(k<wall){
int _k=k^1;
if(xs[_k]>=xs[k])update(xs[k],xs[_k]+1,0,0,W,k/2);
}else{
int t=query(xs[k],0,0,W);
if(~t){
int d=min(abs(py[ys[k]]-py[ys[t*2]]),abs(py[ys[k]]-py[ys[t*2+1]]));
k-=wall; if(d<dis[k])dis[k]=d,v[k]=t;
}
}
}
void fly(int *ry,int *ys,int *xs,int *py,int W){
T[0]=-1; for(int i=0;i<tot;i++)scan(ry[i],ys,xs,py,W);
T[0]=-1; for(int i=tot-1;i>=0;i--)scan(ry[i],ys,xs,py,W);
}
int main(){
scanf("%d%d",&n,&m);
wall=2*n; tot=wall+m;
for(int i=0;i<tot;i++)scanf("%d%d",x+i,y+i);
compress(x,rx,tot,xs,px);
compress(y,ry,tot,ys,py);
fill(dis,dis+m,INT_MAX);memset(w,0,n);
fly(ry,ys,xs,py,xs[rx[tot-1]]+1);
fly(rx,xs,ys,px,ys[ry[tot-1]]+1);
for(int i=0;i<m;i++)++w[v[i]];
for(int i=0;i<n;i++)printf("%d\n",w[i]);
return 0;
}

POJ 3470 Walls(线段树+扫描线)的更多相关文章

  1. POJ 1151 - Atlantis 线段树+扫描线..

    离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...

  2. POJ 1177 Picture(线段树 扫描线 离散化 求矩形并面积)

    题目原网址:http://poj.org/problem?id=1177 题目中文翻译: 解题思路: 总体思路: 1.沿X轴离散化建树 2.按Y值从小到大排序平行与X轴的边,然后顺序处理 如果遇到矩形 ...

  3. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)

    题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...

  5. poj 1177 Picture (线段树 扫描线 离散化 矩形周长并)

    题目链接 题意:给出n个矩形,每个矩形给左下 和 右上的坐标,求围成的周长的长度. 分析: 首先感谢大神的博客,最近做题经常看大神的博客:http://www.cnblogs.com/kuangbin ...

  6. Picture POJ - 1177 (线段树-扫描线)

    A number of rectangular posters, photographs and other pictures of the same shape are pasted on a wa ...

  7. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

  8. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  9. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  10. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

随机推荐

  1. php 报错 Cannot modify header information

    在用CI 开发微信公众号的时候出现下面这么个问题,网上看了一圈解决办法是:把报错的文件用editplus另存为utf-8. Severity: Warning Message: Cannot modi ...

  2. 软工实践 - 第十五次作业 Alpha 冲刺 (6/10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10004469.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  3. BZOJ3668 [Noi2014]起床困难综合症 【贪心】

    题目 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...

  4. 洛谷 P3765 总统选举 解题报告

    P3765 总统选举 题目背景 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大救星小C钦定下一任.作 ...

  5. flex弹性布局的基本介绍

    最近开始做元素排列比较复杂的项目,同时需要各种型号手机的适配,我发现以前所掌握的盒子模型.display.position.float等已经不能满足我的需求了, 于是开始着重学习flex弹性布局并运用 ...

  6. Waifu2x测试

    真的是好玩..给大家(?)提供一个能用Waifu2x upscale的图片类型集合.. 上面是原图下面是Upscaled..因为是png大家自行下载对比..

  7. 部分浏览器上a标签包裹的dom元素显示不正常

    在苹果和部分安卓机上出现,pc端和chrome浏览器响应式设计里怎么样也不会出现的访问后a标签包裹的dom元素显示不正常a标签内的hr元素颜色显示不正常hr水平线的颜色被 bootstrap的css的 ...

  8. HDU 1171Big Event in HDU(转01背包)

    题意: 给你一组数,分成差距最小的两份A,B(A>=B) 分析: 转01背包 注意: 01背包用一维数组 不要用二维 二维数组若是开太大,内存超限,开太小,RE #include "c ...

  9. 将PHP程序中返回的JSON格式数据用gzip压缩输出

    //phpinfo(); 搜索下 zlib 是否开启 //此示例开启压缩 Content-Length:124 Size: 404B //未开启gzip压缩 Content-Length:675 Si ...

  10. python module :shelve

    shelve 是一个 key-value 的数据库. 操作方法和字典几乎一致. shelve 模块功能:以 key - value 的方式存储数据. 写数据 >>> import s ...