二維偏序 tree

2022-05-06 16:30:12 字數 1180 閱讀 6582

最近接觸到一些偏序的東西。

傳統線段樹非葉子節點的劃分點mid=(l+r)/2,但小r線段樹mid是自己定的。但滿足l<=mid​ 這道題n和詢問個數都到了1e5,所以考慮nlogn的做法。

​ 我們發現區間定位個數(答案)和完全被該區間包含的節點個數所相關。具體性質如下:區間定位個數(答案) = 2 * 區間長度 - 完全被該區間包含的節點個數。不難發現完全被該區間包含的節點個可以看作乙個森林,而區間定位出的那些線段節點可以看作這些森林當中數的根。由於乙個長度為l的根的樹的節點個數為 2 ∗ l − 1,那麼這個森林當中每有一棵樹,就會對「2 * 區間長度」這個總和上減去一,故滿足性質。那麼我們將問題轉化為求完全被該區間包含的節點個數。

​ 那麼現在問題就是在所有的區間中,找到[l,r]所完全包含的區間。這是個二維偏序的問題。個人理解所謂二維偏序就是詢問許多向量中,比詢問的向量小的向量。由於這是偏序關係,所以不是任意兩個向量都可以比較大小。這裡的定義是如果乙個區間l,r,l<=l2,並且r>=r2,那麼l,r小於l2,r2。具體做法就是一維排序,然後i從大到小(從小到大也可以,只不過這裡dfs出來順序是從小到大的,那麼就從大到小掃一遍),對於左端點在當前詢問左端點右側的區間,把其右側端點在樹狀陣列裡mark一下。然後查詢的時候,只查詢1到r被mark的值。這樣由於只統計了左端點在l右側的區間,並且區間的右端點被限制在1到r以內,所以所有區間都會被掃到。

​ 感覺這種方法真奇妙。。

#include #include using namespace std;

const int maxn=4e5+5;

int n, m, cntseg, cntline, cntq, beg;

int atree[maxn];

struct nodenode[maxn];

struct line

}line[maxn], queries[maxn];

bool cmp1(const line &x, const line &y)

queries[i].ans=2*(queries[i].r-queries[i].l+1)-query(queries[i].r);

}sort(queries, queries+m, cmp2);

for (int i=0; iprintf("%d\n", queries[i].ans);

return 0;

}

二維偏序問題

想學cdq分治,然而cdq的經典題目是三維偏序問題,是建立在二維偏序問題的基礎上的。我這只蒟蒻連個二維偏序問題都沒做過。在網上找了一大圈,才勉強找到乙個二維偏序的題目。bzoj的許可權啊。是時候買個許可權號了。題目鏈結 這個牛客網也不知道是什麼鬼。給你n個物品,每個物品有兩個參量,分別為 s,w 讓...

Laptop 二維偏序

fst是一名可憐的小朋友,他很強,但是經常fst,所以rating一直低迷。但是重點在於,他非常適合acm!並在最近的區域賽中獲得了不錯的成績。拿到獎金後fst決定買一台新筆記本,但是fst發現,在 能承受的範圍內,筆記本的記憶體和速度是不可兼得的。可是,有一些筆記本是被另外一些 完虐 的,也就是記...

二維三維偏序

一維偏序 就是排序,二維偏序 排序 樹狀陣列 例題 給定 n 個點 x,y 定義每個點的等級是在該點左下方 含正左 正下 的點的數目,試統計每個等級有多少個點。題目鏈結 分析 對於二維偏序 對1維x進行排序,那麼在右邊的點不會對左邊的點有貢獻。然後對y建立樹狀陣列。計算0 y的和,就是sum y i...