很不錯的一道線段樹題,這裡的降維方式值得我們學習。
題意:已知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。這種線段樹只能離線來寫,離線的方法是按照查詢區間的右端點來排序,然後這道題目的資料範圍較大需要離散化簡單處理一下,然後對於輸入的每個點來說,順序走下去。然後如果當前點之前出...