POJ 3470 Walls(线段树+扫描线)

 

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

 

【题目大意】

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

 

【题解】

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

 

【代码】

#include 
#include  
#include 
#include 
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]>1;
    if(q>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=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=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

转载于:https://www.cnblogs.com/forever97/p/poj3470.html

你可能感兴趣的:(数据结构与算法)