portal
有\(n(n\leq10^5)\)隻鳥分布在二維平面的整點上。每只鳥有威武值、士氣值和團結值:威武值是固定的;士氣值等於與其在同一位置的其他鳥的威武值的最大值;團結值等於與其在同一位置的其他鳥的隻數。接下來\(t(t\leq2.5\times10^5)\)秒,第\(i\)秒會有乙隻鳥\(b_i\)由原位置飛向\((x_i,y_i)\)。求每只鳥在這\(t\)秒中,最大士氣值與最大團結值的乘積。
用平衡樹搞。
對於每個整點維護一棵splay,因為最多出現\(n+t\)個不同的座標所以可以將每個座標對應成乙個數值,map
或者離散化均可。splay維護子樹大小\(siz\),子樹最大武力值\(maxv\),每個點的目前最大士氣值\(ans_1\)和最大團結值\(ans_2\)。第\(i\)秒時按以下順序進行操作:
\(t\)秒後,將所有標記下放,輸出\(ans_1[i]\times ans_2[i]\)。
時間複雜度\(o(tlogn)\)。
//千山鳥飛絕
#include #include #include using namespace std;
typedef pairpairi;
inline char gc()
return *s++;
}inline int read()
void clear(int p)
void update(int p)
void mark(int p,int t1,int t2)
void pushdw(int p)
void rotate(int p)
void pushdwrt(int p)
void splay(int p)
void ins(pairi c,int p)
int q=rt[h[c]];
ans1[p]=max(ans1[p],maxv[q]);
ans2[p]=max(ans2[p],siz[q]);
mark(q,val[p],siz[q]);
fa[ch[p][0]=q]=p,update(rt[h[c]]=p);
}void del(int p)
int q=ch[p][0]; while(ch[q][1]) q=ch[q][1];
splay(q); fa[ch[q][1]=ch[p][1]]=q; update(q);
}void pushdwall(int p)
int main()
int t=read();
for(int i=1;i<=t;i++)
for(int i=1;i<=cnt;i++) pushdwall(rt[i]);
for(int i=1;i<=n;i++) printf("%lld\n",(long long)ans1[i]*ans2[i]);
return 0;
}
原以為碼量超大,寫完發現還可以嘛!
還有萬徑人蹤滅,孤舟蓑笠翁,獨釣寒江雪等你來寫哦~
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 千山鳥飛絕
離散化座標,每個座標開一棵以鳥的編號為關鍵字的平衡樹。每次插入時打2個標記,同時更新自身。這個方法比較顯然,而且好寫。正解好像用很迷的方法亂搞了一波,然後用線段樹不打標記就做出來了,並不會。treap旋轉沒傳引用,調了好久。include define n 30005 define m 330005...
題解 BZOJ 2827 千山鳥飛絕
話說有一天 doyouloveme 和 vfleaking 到山里玩。誰知 doyouloveme 剛剛進山,所有的鳥兒竟被他的神犇氣場給驚得全部飛走了。vfleaking 頓時膜拜不已。這時鳥王用鳥語說道 安撫了一下眾鳥的情緒。鳥王生性好鬥,作出了乙個決定 要排鳥布陣把剛才嚇到它們的人類趕出山去。...