BZOJ2827 千山鳥飛絕 (離散 treap)

2021-08-15 16:11:59 字數 1897 閱讀 4648

題目鏈結

好長。。。。。

但是我覺得這個題目的名字特別好。

儘管感覺是個很弱的題目,好歹是最為資料結構以及 treap的練手題目嘛

首先看起來我們就是需要資料結構去維護個什麼東西

座標比較散,所以我們可以先離散,排個序就可以了,但是要去重!?其實不去也是對的,因為每次都會選擇同乙個位置

然後就是修改操作

要支援查詢最大值、統計元素個數、打上標記(而且是兩個),還要分離合併

那麼treap真是太好不過了。

時間複雜度o(t(logn+logt)) 呵呵,排序+查詢的時間複雜度

還有就是最後的答案可能是ll

話說這裡維護的對樹的形態有關的那個權值我用的是鳥標號,但是正好也就是陣列下標

記得之前我說這個題目很弱,對不起我錯啦。。。。

作為乙個從來沒有寫個資料結構的傢伙。。。。寫了一上午才寫出來呀。。。。

無限re。。。。少主家題庫是可以看資料的嘛。。。然後刷bzoj真的好累啊。。。但是要練習,必須刷的。。

最後我是通過自己生成資料來找出了錯誤,也為查錯找了乙個方法嘛。。。

還有就是找到錯誤之後,不要改對了就算了,要看錯誤的根本原因,而不是掩耳盜鈴地改個表面的東西額。

不過為什麼其他人的**這麼短啊啊啊啊!!!

真的是個很靈活的東西。

我感覺這次用的非常靈活啊。。

在按值**的時候,注意等於的情況是掛在哪個集合裡面,看看**就知道, v

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define lc ch[now][0]

#define rc ch[now][1]

const int maxn=3e4+100,maxt=3e5+1000;

struct xy

friend bool operator==(xy a,xy b)

}p[maxn+maxt];

int cnt;

struct data

}a[maxn],q[maxt];

struct treap

int newnode(int np,int v)

void pushup(int now)

void pushdown(int now)

int merge(int a,int b)

else

}void split(int now,int v,int &a,int &b)

if(vlc,v,a,lc);

}else

pushup(now);

}int find(int now,int v)

return now;

}void outs()

void add1(int i,int t)

tp.split(tp.rt[t],i,a,b);

tp.rt[t]=tp.merge(tp.merge(a,c),b);

sub[i]=t;

}void add2(int i,int t)

tp.split(tp.rt[t],i,a,b);

tp.rt[t]=tp.merge(tp.merge(a,i),b);

sub[i]=t;

}void solve()

)-p;

add1(i,t);

}for(int i=1;i<=m;i++)

)-p;

add2(q[i].w,t);

}}void outs()

}int main()

bzoj 2827 千山鳥飛絕

time limit 10 sec memory limit 128 mb submit 802 solved 228 submit status discuss 51 1 1 3 1 2 4 4 4 2 0 1 2 2 3 51 1 2 2 4 4 2 4 3 3 0 1 5 0 134 688對...

BZOJ2827 千山鳥飛絕

portal 有 n n leq10 5 隻鳥分布在二維平面的整點上。每只鳥有威武值 士氣值和團結值 威武值是固定的 士氣值等於與其在同一位置的其他鳥的威武值的最大值 團結值等於與其在同一位置的其他鳥的隻數。接下來 t t leq2.5 times10 5 秒,第 i 秒會有乙隻鳥 b i 由原位置...

BZOJ2827 千山鳥飛絕

離散化座標,每個座標開一棵以鳥的編號為關鍵字的平衡樹。每次插入時打2個標記,同時更新自身。這個方法比較顯然,而且好寫。正解好像用很迷的方法亂搞了一波,然後用線段樹不打標記就做出來了,並不會。treap旋轉沒傳引用,調了好久。include define n 30005 define m 330005...