題目鏈結
好長。。。。。
但是我覺得這個題目的名字特別好。
儘管感覺是個很弱的題目,好歹是最為資料結構以及 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...