小鸟往四个方向飞都枚举一下,数据范围没给,离散以后按在其中一个轴线排序,在线段树上更新墙的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. saltstack一键部署高可用

    一健推送apache [root@server1 minions]# cd /etc/salt/ [root@server1 salt]# vim master [root@server1 salt] ...

  2. vue写的ToDoList

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Maven 错误 Failure to transfer ...was cached in the local repository...

    Maven 错误 Failure to transfer ...was cached in the local repository... 我解决的时候多了两步才解决 1. mvn clean ins ...

  4. Python字符和编码

    1. 字符和编码 背景 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte). 由于计算机是美国人发明的,因此, ...

  5. python 之serial

    一 先按照 pywin32:pywin32是一个非常强大的Python扩展库,是Python调用Windows系统底层功能的最佳接口,不安装这个按照pyserial也没有用 二 按装pyserial ...

  6. CAD安装失败怎样卸载CAD 2010?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  7. 性能测试工具LoadRunner05-LR之Virtual User Generator html模式与url模式

    “HTML-based script”说明 在默认情况下,选择“HTML-based script”,说明脚本中采用HTML页面的形式来表示,这种方式的脚本容易维护,容易理解,推荐这种方式录制 “UR ...

  8. 使用vue Devtools

    第一步: 在谷歌应用商店中查找 vue Devtools 并安装.安装之后,即使我们打开了vue项目发现vue标识是灰色的,说明并没有成功启动vue. 第二步: 默认安装的情况下,找到C:\Users ...

  9. Erlang C 與M/M/N排隊模型

    一何谓排队模型 在现实生活中排队的现象可说是无处不在,如:买票.超商.百货公司…等.顾客总是在揣测"排在哪一个服务台会比较快?"或"到底还要排多久呢?"类似这样 ...

  10. Quartz使用(4) - Quartz监听器Listerner

    1. 概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.Trigger ...