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.pswp.cn/news/256346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256346.shtml
英文地址,請注明出處:http://en.pswp.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;…