hdu5107 線段樹處理三維問題

2021-06-27 02:49:26 字數 1272 閱讀 2237

很不錯的一道線段樹題,這裡的降維方式值得我們學習。

題意:已知n個建築的座標(x,y)和高度,查詢點(x,y)的左下角中高度第k小的建築的高度。

解題思路:座標加高度相當於是乙個三維的題目。首先要發現這裡的k非常小,所以我們只要用線段樹維護區間內最小的10個建築的高度。現將查詢與建築一起離散化處理,採用巧妙的降維方式,將x、y、flag(是否為建築)的優先順序排序,y作為線段樹下標。對於建築只要進行單點更新操作即可,查詢操作是乙個區間[1,pos]的查詢。

**如下:

#include#include#include#define n 30005

using namespace std;

struct node

}s[n*2];

int a[n*2];

struct tree

tree[n*8];

void build(int o,int l,int r)

void del(int o)//只記錄乙個區間的10個最小值

void pushup(int o)

void update(int o,int pos,int k)

int m = (tree[o].l+tree[o].r)/2;

if(pos <= m) update(2*o,pos,k);

else update(2*o+1,pos,k);

pushup(o);

}int path[25],sz;

void query(int o,int x,int y)

int m = (tree[o].l + tree[o].r)/2;

if(x <= m) query(2*o,x,y);

if(y > m) query(2*o+1,x,y);

}int ans[n*2];

int main()

sort(s,s+n+m);

sort(a,a+tot);//將y座標離散話處理

tot = unique(a,a+tot) - a;

build(1,1,tot);

for(i = 0; i < n+m; i++)

else

}for(i = n; i < n+m; i++)

}return 0;}/*

5 31 1 2

2 2 3

2 4 4

3 1 6

4 4 1

2 3 2

1 1 1

4 4 1

*/

hdu 預處理 線段樹)

給n個數,m個詢問,問任意區間內與其它數互質的數有多少個 比如3個數1 2 4,詢問 1,3 那麼答案是1 千萬要記住,這樣的題目,如果你不轉變下,使勁往線段樹想 雖然轉變之後,也說要用到線段樹,但是維護的東西不同了 那麼會發現這樣的題目,區間與區間之間是無法傳遞資訊的,區間與區間是無法傳遞資訊的,...

hdu 4288 線段樹 離線處理

hdu 4288 題意 給你類似乙個公升序的set結構 add就是加入乙個數 del就是刪除乙個數 sum就是把所有 5 3的位置的數求和 這題我們怎麼入手呢?以前做過一道類似的樹狀陣列開55個的題 這個題其實大同小異 就是對sum陣列表示 5的值我們開個sum 5 那麼你既然是公升序的 我每次ad...

HDU 3333 線段樹 離線處理

hdu 3333 線段樹 離線處理 問你給定區間內的不重複的數字的和,如1 1 1 3 4 區間1到2就是1,區間1到5就是8。這種線段樹只能離線來寫,離線的方法是按照查詢區間的右端點來排序,然後這道題目的資料範圍較大需要離散化簡單處理一下,然後對於輸入的每個點來說,順序走下去。然後如果當前點之前出...