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是什么节奏?我记得我开够了啊.. ...
随机推荐
- 浅谈ORM操作
2. ORM(对象关系映射) 1. 映射的关系 DB ORM 数据表 <--> 类 数据行 <--> 对象 字段 <--> 属性 2. Django项目使用MySQ ...
- .net core项目中引用.net framework封装的dll库
https://blog.csdn.net/sharphou/article/details/80746551 A----------如何安装IIS [Server Hosting]------- ...
- JS之scrollTop、offsetHeight和offsetTop等属性用法详解和拖拽div
标题中的几个相关相关属性在网页中有这大量的应用,尤其是在运动框架中,但是由于有些属性相互之间的概念比较混杂或者浏览器兼容性问题,导致掌握起来比较有难度,下面就介绍一下相关属性的用法.先来看一张比较经典 ...
- java——修改txt文件中某一行的内容
今天无意间看到java.io中有一个类:RandomAccessFile,可以在文件的任意位置进行读写操作,想到我之前写的一个小项目,想在txt中修改某一行的内容,都是从头遍历txt文件,修改这一行的 ...
- Python 类 面向对象(Classes)
Python 支持面向对象 class Greeter(object): #构造函数 def __init__(self,name): self.name = name # 创建一个实例变量 #定义一 ...
- 研磨设计模式学习笔记4--单例模式Signleton
需求:加载配置文件,由于配置文件全局唯一,所以不用过多对象,建一个就可以了. 优点:单例模式本质就是为了控制实例数目. 一.饿汉式 public class Singleton { private S ...
- 在使用clone()时id保持一致
大家都知道,同一个HTML页面中,不宜出现1个以上相同名称的id.但有时候需要使用jQuery框架的clone()来复制相同内容(附带样式),假如是使用了id号的获取方式,即$(‘#***’) 那么复 ...
- pyplot
错误: 执行 import matplotlib.pyplot 报错 ImportError: No module named _tkinter, please install the python- ...
- 【Linux】ping命令详解
1.ping指定目的地址10.10.0.1 为接口tun0 ping 10.10.0.1 -i tun0
- 利用jquery给指定的table动态添加一行、删除一行,复制,值不重复等操作
$("#mytable tr").find("td:nth-child(1)") 1表示获取每行的第一列$("#mytable tr").f ...