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+5;
int N, M;
int dist[MAX_N];
int fly_to[MAX_N];
int wall_cnt[MAX_N];const int MAX_SIZE = MAX_N*3;
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 = 0; i < sz; i++){r[i] = i;}fi = dat; //se = dat_;sort(r,r+sz,cmp);mp[a[r[0]] = 1] = dat[r[0]];for(int i = 1; i < sz; i++){int k = r[i], p = r[i-1];if(dat[k] != dat[p]){mp[ a[k] = a[p]+1 ] = dat[k];}else {a[k] = a[p];}}
}void init()
{// wall [0 N*2), bird [N*2, Ui)sp = N*2; dat_sz = sp+M;for(int i = 0; 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 = 1<<19;int cv[ST_SIZE];
//完整覆盖,wall的idx , 不完整覆盖 -1,  完全无覆盖 0
int n0;
int qpos;int query(para)
{if(~cv[o]) return cv[o];else {Tvarreturn qpos <= mid? query(lsn) : query(rsn);}
}int ql, qr, qval;void update(para)
{if(insd){cv[o] = qval;}else {Tvarif(~cv[o]) {cv[lc] = cv[rc] = cv[o];cv[o] = -1;}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^1;//trick 小鸟可能在墙的延迟线上,害得我WA了无数发 T_Tif((xs[k2] >= xs[k])){qval = (k>>1)+1;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<<1]]), abs(pos_b - mpy[ys[w_id<<1|1]]) );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 = 1; qr = n0; qval = 0;update();for(int i = 0; i < dat_sz; i++){sweep_line(ry[i],ys,xs,mpy);}ql = 1; qr = n0; qval = 0;update();for(int i = dat_sz-1; i >= 0; 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-1]]);fly(rx,xs,ys,mpx,ys[ry[dat_sz-1]]);memset(wall_cnt,0,sizeof(int)*N);for(int i = 0; i < M; i++) wall_cnt[fly_to[i]]++;for(int i = 0; i < N; i++){printf("%d\n", wall_cnt[i]);}
}//#define LOCAL
int main()
{
#ifdef LOCALfreopen("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 0;
}

 

转载于:https://www.cnblogs.com/jerryRey/p/5004597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# —— 深入理解委托类型

一. 委托定义 1. 委托与多播委托 委托类型表示对具有特定参数列表和返回类型的方法的引用&#xff0c;定义了委托实例可以调用的某类方法。 通过委托&#xff0c;我们可以动态的通过委托变量来调用委托方法。一般用delegate来命名委托类型,但Action和Func也可以达到同样的效果…

【VS开发】【C++语言】reshuffle的容器实现算法random_shuffle()的使用

假设你需要指定范围内的随机数&#xff0c;传统的方法是使用ANSI C的函数random(),然后格式化结果以便结果是落在指定的范围内。但是&#xff0c;使用这个方法至少有两个缺点。首先&#xff0c;做格式化时&#xff0c;结果常常是扭曲的&#xff0c;所以得不到正确的随机数&…

C#委托——基础2

在上一篇随笔中&#xff0c;简要说明了怎样定义委托&#xff0c;定义事件&#xff0c;订阅事件&#xff0c;最后也实现了效果&#xff0c;就是当员工类的某个对象&#xff0c;执行某个事件时&#xff0c;委托事件被触发&#xff0c;后面也得到了结果&#xff0c;但是想象一下实…

机器学习——深度学习之编程工具、流行网络结构、卷积神经网络结构的应用

目录 一、编程工具 caffe实现LENET-5 二、流行的网络结构 1、VGGNET 2、Googlenet ​ 3、ResNet​ ​ 三、卷积神经网络的应用 1、人脸识别 ​ 2、人脸验证 3、人脸特征点检测 4、卷积神经网络压缩 一、编程工具 caffe的优点&#xff1a;模型标准化&#xff0c;源代码…

Halcon例程详解(激光三角系统标定)—— calibrate_sheet_of_light_calplate.hdev

前言 1 激光三角测距 激光三角测距法原理很简单,是通过一束激光以一定的入射角度照射被测目标,激光在目标表面会产生漫反射,在另一角度利用透镜对反射激光汇聚成像,光斑成像在CCD(Charge-coupled Device,感光耦合组件)位置传感器上。当被测物体沿激光方向发生移动时,…

【转】如何实现一个文件系统

如何实现一个文件系统 摘要 本章目的是分析在Linux系统中如何实现新的文件系统。在介绍文件系统具体实现前先介绍文件系统的概念和作用&#xff0c;抽象出文件系统概念模型。熟悉文件系统的内涵后&#xff0c;我们再进一步讨论Linux系统中文件系统的特殊风格和具体文件系统在Li…

【tenserflow】——数据类型以及常用属性

目录 一、什么是Tensor&#xff1f; 二、Tensorflow常见数据类型 三、Tensorflow常见属性device\cpu\gpu\ndim\shape\rank等 1、创建一个tensor 1&#xff09;tf.constant() 2)tf.Variable() 2、判断一个变量是否为tensor张量 3、生成不同设备&#xff08;cpu,gpu&#x…

C# 事件详解附实例分析

一、定义 事件是两个对象间发布消息和响应后处理消息的过程&#xff0c;通过委托类型来实现的。 事件的机制被称为发布-订阅机制&#xff0c;其算法过程为&#xff1a;首先定义一个委托类型&#xff0c;然后在发布者类中声明一个event事件&#xff0c;同时此类中还有一个用来触…

网页开发浏览器兼容性问题

1、在ie6下的双margin问题 在ie6下&#xff0c;设置了float的元素&#xff0c;以float:left为例&#xff0c;如图所示。会出现第一个浮动元素&#xff0c;即相对于父级元素浮动的&#xff0c;会出现双倍margin的问题。 注意仅仅是相对于父级元素浮动的&#xff0c;即第一个会出…

【tensorflow】——创建tensor的方法

目录 1、tf.constant() 2、tf.Variable() 3、tf.zeros():用0去填充指定形状的数组 4、tf.convert_to_tensor(a,dtypetf.int32) 5、tf.ones():用1去填充指定形状的数组 6、tf.fill():用指定的元素去填充指定形状的数组 7、随机化初始化进行创建 1&#xff09;normal正态分…

Halcon —— 图像像素类型与转换

图像类型 就目前工业领域主流的图像处理工具halcon来讲&#xff0c;有以下几种图像类型&#xff1a;‘byte’, ‘complex’, ‘cyclic’, ‘direction’, ‘int1’, ‘int2’, ‘int4’, ‘int8’, ‘real’, ‘uint2’&#xff0c;具体含义如下图所示。 ‘byte’ 每像素1字节…

软件方法

核心工作流业务建模&#xff08;组织建模&#xff09;&#xff1a;描述组织内部各个系统如何协作&#xff0c;使得组织可以为其他的组织提供有价值的服务&#xff0c;新系统只不过是组织为了对外提供更好的服务&#xff0c;对自己的内部重新设计而购买的一个零件。需求&#xf…

修改vim中的tab为4个空格

记录一下&#xff0c;避免用时还得搜........ 1、临时修改 在vi中&#xff0c;set tabstop4 或 set ts4  2、永久修改 vi --version 查看要修改的文件如果是vim的话&#xff0c;修改~/.vimrc如果是vi&#xff0c;修改~/.exrc加上&#xff1a;set tabstop4set nu //显示行号set…

Halcon例程详解(基于卡尺工具的匹配测量方法) —— measure_stamping_part.hdev

前言 1卡尺工具介绍 Halcon中的Metrology方法即为卡尺工具&#xff0c;可用来拟合线&#xff0c;圆&#xff0c;这种方法对于目标比背景很明显的图像尺寸测量是很方便的&#xff0c;不需要用blob进行边缘提取等&#xff0c;但缺点也很明显&#xff0c;需要目标的相对位置基本…

【TensorFlow】——不同shape的tensor在神经网络中的应用(scalar,vector,matrix)

目录 ​ 1、scalar——标量 1&#xff09;在神经网络中存在的场景 2&#xff09;one_hot编码 3&#xff09;举例应用 2、vector——向量 ​ 3、matrixs——矩阵 4、dim3的tensor 5、dim4的tensor 6、dim5的tensor 本文主要的目的是让初学者对tensor的各种形式的使用场…

404页面 3秒后跳到首页 实现

---恢复内容开始--- 当我们访问一个页面不存在的时候&#xff0c;就会跳到404页面 一般网站都在在404页面中做一个处理&#xff0c; 就是当用户3秒种内还没有任何操作的话&#xff0c;就会自动跳转到其它页面 技术实现有两种方法 1. 在404页面中的header间加上 <meta http-e…

Java - I/O

File类 java.io操作文件和目录&#xff0c;与平台无关。具体的常用实例方法&#xff1a; File file new File("."); // 以当前路径创建名为 "." 的 File 对象   文件目录信息函数     -   String getName/Path/Parent()&#xff1a; 文件名/路径…

Halcon —— 边缘检测算子详解

一、算子介绍 1.1 种类 halcon内常用的边缘检测算子包括如下几种&#xff1a; 1.edges_image: 提取2D 图像边缘 2.edges_sub_pix&#xff1a;提取2D图像亚像素边缘 3.edges_object_model_3d &#xff1a;提取3D图像边缘 4.edges_color和edges_color_sub_pix&#xff1a;提取彩…

【TensorFlow】——索引与切片

目录 1、利用index进行索引 2、利用“&#xff1a;”和“...”进行索引与切片 3、tf.gather&#xff08;&#xff09;——对一个维度进行乱序索引 优势&#xff1a; 缺点&#xff1a; 例子 4、tf.gather_nd()——同时对多个维度进行索引 5、tf.boolean_mask()——通过布…

华硕(ASUS)X554LP笔记本一开机就进入aptio setup utility 问题的解决

某次因大意一直未插电&#xff0c;华硕&#xff08;ASUS&#xff09;X554LP笔记本后来没电关机。后来每次一开机就进入aptio setup utility界面&#xff0c;按F9调入默认配置&#xff0c;F10保存后退出&#xff0c;重启仍然进入aptio setup utility。 网上查了一下&#xff0c;…