小鸟往四个方向飞都枚举一下,数据范围没给,离散以后按在其中一个轴线排序,在线段树上更新墙的id,然后就是点查询在在哪个墙上了。

这题有个trick,因为数据范围没给我老以为是inf设置小了,WA了很多发。(距离可能比0x3f3f3f3f大

实现上,我是把鸟和墙的坐标放一起的,用下标来区别两者。

/*********************************************************
* ------------------ *
* author AbyssalFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<numeric>
#include<cassert>
using namespace std; typedef long long ll;
const int MAX_N = 5e4+;
int N, M;
int dist[MAX_N];
int fly_to[MAX_N];
int wall_cnt[MAX_N]; const int MAX_SIZE = MAX_N*;
int x[MAX_SIZE], y[MAX_SIZE];
int rx[MAX_SIZE], ry[MAX_SIZE];
int xs[MAX_SIZE], ys[MAX_SIZE];//discrete data
int mpx[MAX_SIZE], mpy[MAX_SIZE];//用于离散idx访问原值
int sp, dat_sz; int *fi;//, *se;
bool cmp(int a, int b)
{
return fi[a] < fi[b];// || (fi[a] == fi[b] && se[a] < se[b]);
} /*
parameter :
原始数据dat , 名次r ,size, 离散数据 a
*/ void compress(int *dat, int *r, int sz, int *a, int *mp)//int *dat_
{
for(int i = ; i < sz; i++){
r[i] = i;
}
fi = dat; //se = dat_;
sort(r,r+sz,cmp);
mp[a[r[]] = ] = dat[r[]];
for(int i = ; i < sz; i++){
int k = r[i], p = r[i-];
if(dat[k] != dat[p]){
mp[ a[k] = a[p]+ ] = dat[k];
}
else {
a[k] = a[p];
}
}
} void init()
{
// wall [0 N*2), bird [N*2, Ui)
sp = N*; dat_sz = sp+M;
for(int i = ; i < dat_sz; i++){
scanf("%d%d", x+i, y+i);
}
compress(x, rx, dat_sz, xs, mpx);
compress(y, ry, dat_sz, ys, mpy);
} #define para int o = 1, int l = 1,int r = n0
#define Tvar int mid = (l+r)>>1, lc = (o<<1), rc = (o<<1|1);
#define lsn lc, l, mid
#define rsn rc, mid+1, r
#define insd ql<=l&&r<=qr
const int ST_SIZE = <<; int cv[ST_SIZE];
//完整覆盖,wall的idx , 不完整覆盖 -1, 完全无覆盖 0
int n0;
int qpos; int query(para)
{
if(~cv[o]) return cv[o];
else {
Tvar
return qpos <= mid? query(lsn) : query(rsn);
}
} int ql, qr, qval; void update(para)
{
if(insd){
cv[o] = qval;
}
else {
Tvar
if(~cv[o]) {
cv[lc] = cv[rc] = cv[o];
cv[o] = -;
}
if(ql <= mid) update(lsn);
if(qr > mid) update(rsn);
}
} void sweep_line(int k, int *ys, int *xs, int *mpy)
{
if(k < sp){
int k2 = k^;
//trick 小鸟可能在墙的延迟线上,害得我WA了无数发 T_T
if((xs[k2] >= xs[k])){
qval = (k>>)+;
ql = xs[k]; qr = xs[k2];
update();
}
}
else {
qpos = xs[k];
int w_id = query();
//assert(w_id != -1);
if(w_id) {
w_id--;
int pos_b = mpy[ys[k]];
int d = min( abs(pos_b - mpy[ys[w_id<<]]), abs(pos_b - mpy[ys[w_id<<|]]) );
k -= sp;
if(d < dist[k]){
dist[k] = d; fly_to[k] = w_id;
}
}
}
} void fly(int *ry, int *ys, int *xs, int *mpy, int mxx)
{
n0 = mxx;
ql = ; qr = n0; qval = ;
update(); for(int i = ; i < dat_sz; i++){
sweep_line(ry[i],ys,xs,mpy);
} ql = ; qr = n0; qval = ;
update();
for(int i = dat_sz-; i >= ; i--){
sweep_line(ry[i],ys,xs,mpy);
}
} void solve()
{
//memset(ans,0x3f,sizeof(ll)*M);
fill(dist, dist+M, 0x7fffffff); fly(ry,ys,xs,mpy,xs[rx[dat_sz-]]);
fly(rx,xs,ys,mpx,ys[ry[dat_sz-]]);
memset(wall_cnt,,sizeof(int)*N);
for(int i = ; i < M; i++) wall_cnt[fly_to[i]]++;
for(int i = ; i < N; i++){
printf("%d\n", wall_cnt[i]);
}
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
//cout<<((int)ceil(log2(15e4))+1);
while(~scanf("%d%d", &N, &M)){
//assert(N<=MAX_N && M <= MAX_N);
init();
solve();
}
return ;
}

POJ - 3470 Walls的更多相关文章

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

    [题目链接] http://poj.org/problem?id=3470 [题目大意] 给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点), 鸟只会垂直x轴或者y轴飞行,并且会撞上最近 ...

  2. POJ 1161 Walls(最短路+枚举)

    POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...

  3. POJ 1161 Walls【floyd 以面为点建图】

    题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...

  4. poj 1161 Walls

    https://vjudge.net/problem/POJ-1161 题意:有m个区域,n个小镇,有c个人在这些小镇中,他们要去某一个区域中聚会,从一个区域到另一个区域需要穿墙,问这些人聚到一起最少 ...

  5. POJ 1161 Walls(Floyd , 建图)

    题意: 给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城. 分析: 其实这题难就难在建图, ...

  6. POJ 1161 Walls ( Floyd && 建图 )

    题意 :  在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...

  7. Walls POJ 1161

    参考了大牛的博客 http://blog.csdn.net/wangjian8006/article/details/7958838 题目大意: 给出n个点,在这些点中有些点是俱乐部点,并且有m个区域 ...

  8. poj 1266 Cover an Arc.

    http://poj.org/problem?id=1266 Cover an Arc. Time Limit: 1000MS   Memory Limit: 10000K Total Submiss ...

  9. 【POJ】1556 The Doors(计算几何基础+spfa)

    http://poj.org/problem?id=1556 首先路径的每条线段一定是端点之间的连线.证明?这是个坑...反正我是随便画了一下图然后就写了.. 然后re是什么节奏?我记得我开够了啊.. ...

随机推荐

  1. jinkens 'python' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    jinkens执行构建时报错 解决方法,就是指定路径.python的安装目录和被执行文件的的目录

  2. testlink数据库访问密码修改

    testlink重启后数据库连接不上将会报错 错误:1045 - Access denied for user 'my_db '@'localhost' (using password: YES) 怎 ...

  3. Java学习笔记day08_day09_对象实例化_private_this

    1.类与对象 类就是一个模版. 对象的实例化就是根据模版类, 使用new关键字创建实际的对象. 2.类的定义及创建对象 类的定义格式: public class 类名{ //属性(变量) 数据类型 变 ...

  4. CSS background 属性全家桶

    介绍我们都知道css的background属性是一个复合属性,可以简写成一行代码,也可以将每个属性分开来写. background 简写属性在一个声明中设置所有的背景属性.如:body{ backgr ...

  5. vue.js入门环境搭建

    1.node.js环境(npm包管理器) 2.vue-cli手脚架构建工具 3.cnpm npm的淘宝镜像 安装node.js 从node.js官网下载并安装node,安装过程一路“下一步”就可以 安 ...

  6. spring webapp的配置文件放置在项目外的方法

    在web.xml中,填写     <context-param>         <param-name>CFG_HOME</param-name>         ...

  7. RTT设备与驱动之SPI

    SPI全双工设备的操作分为主设备和从设备(可以多个,多线程下从设备访问主设备要先获得总线控制权) rt_device_t rt_device_find(const char* name);查找设备 s ...

  8. MOS管

    mos工作原理:http://www.360doc.com/content/15/0930/11/28009762_502419576.shtml, 开关特性好,长用于开关电源马达驱动,CMOS相机场 ...

  9. [转]25个HTML5和JavaScript游戏引擎库

    本文转自:http://www.open-open.com/news/view/27c6ed 1. The GMP JavaScript Game Engine GMP是一个基于精灵2-D游戏,它可以 ...

  10. SSM-@Transactional 注释不生效

    1.在applicationConext.xml 中配置事务注解驱动 <!-- 事务注解驱动 --> <tx:annotation-driven /> <!-- 配置事务 ...