POJ - 3470 Walls
小鸟往四个方向飞都枚举一下,数据范围没给,离散以后按在其中一个轴线排序,在线段树上更新墙的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的更多相关文章
- POJ 3470 Walls(线段树+扫描线)
[题目链接] http://poj.org/problem?id=3470 [题目大意] 给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点), 鸟只会垂直x轴或者y轴飞行,并且会撞上最近 ...
- POJ 1161 Walls(最短路+枚举)
POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...
- POJ 1161 Walls【floyd 以面为点建图】
题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...
- poj 1161 Walls
https://vjudge.net/problem/POJ-1161 题意:有m个区域,n个小镇,有c个人在这些小镇中,他们要去某一个区域中聚会,从一个区域到另一个区域需要穿墙,问这些人聚到一起最少 ...
- POJ 1161 Walls(Floyd , 建图)
题意: 给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城. 分析: 其实这题难就难在建图, ...
- POJ 1161 Walls ( Floyd && 建图 )
题意 : 在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...
- Walls POJ 1161
参考了大牛的博客 http://blog.csdn.net/wangjian8006/article/details/7958838 题目大意: 给出n个点,在这些点中有些点是俱乐部点,并且有m个区域 ...
- poj 1266 Cover an Arc.
http://poj.org/problem?id=1266 Cover an Arc. Time Limit: 1000MS Memory Limit: 10000K Total Submiss ...
- 【POJ】1556 The Doors(计算几何基础+spfa)
http://poj.org/problem?id=1556 首先路径的每条线段一定是端点之间的连线.证明?这是个坑...反正我是随便画了一下图然后就写了.. 然后re是什么节奏?我记得我开够了啊.. ...
随机推荐
- saltstack一键部署高可用
一健推送apache [root@server1 minions]# cd /etc/salt/ [root@server1 salt]# vim master [root@server1 salt] ...
- vue写的ToDoList
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Maven 错误 Failure to transfer ...was cached in the local repository...
Maven 错误 Failure to transfer ...was cached in the local repository... 我解决的时候多了两步才解决 1. mvn clean ins ...
- Python字符和编码
1. 字符和编码 背景 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte). 由于计算机是美国人发明的,因此, ...
- python 之serial
一 先按照 pywin32:pywin32是一个非常强大的Python扩展库,是Python调用Windows系统底层功能的最佳接口,不安装这个按照pyserial也没有用 二 按装pyserial ...
- CAD安装失败怎样卸载CAD 2010?错误提示某些产品无法安装
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- 性能测试工具LoadRunner05-LR之Virtual User Generator html模式与url模式
“HTML-based script”说明 在默认情况下,选择“HTML-based script”,说明脚本中采用HTML页面的形式来表示,这种方式的脚本容易维护,容易理解,推荐这种方式录制 “UR ...
- 使用vue Devtools
第一步: 在谷歌应用商店中查找 vue Devtools 并安装.安装之后,即使我们打开了vue项目发现vue标识是灰色的,说明并没有成功启动vue. 第二步: 默认安装的情况下,找到C:\Users ...
- Erlang C 與M/M/N排隊模型
一何谓排队模型 在现实生活中排队的现象可说是无处不在,如:买票.超商.百货公司…等.顾客总是在揣测"排在哪一个服务台会比较快?"或"到底还要排多久呢?"类似这样 ...
- Quartz使用(4) - Quartz监听器Listerner
1. 概述 Quartz的监听器用于当任务调度中你所关注事件发生时,能够及时获取这一事件的通知.类似于任务执行过程中的邮件.短信类的提醒.Quartz监听器主要有JobListener.Trigger ...