題解 BZOJ 2827 千山鳥飛絕

2022-02-15 23:12:46 字數 2436 閱讀 9286

話說有一天 doyouloveme 和 vfleaking 到山里玩。誰知 doyouloveme 剛剛進山,所有的鳥兒竟被他的神犇氣場給驚得全部飛走了。vfleaking 頓時膜拜不已。

這時鳥王用鳥語說道:「!@#¥%……?」安撫了一下眾鳥的情緒。鳥王生性好鬥,作出了乙個決定——要排鳥布陣把剛才嚇到它們的人類趕出山去。

每只鳥都有乙個編號,都有乙個威武值。每秒鐘鳥王都會發乙個命令,編號為 \(v\) 的鳥飛到 \((x,y)\) 去(座標系原點是山頂,座標單位為鳥爪)。

鳥飛得很快,一秒之內就飛到了,可以看作是瞬間移動。如果編號為 \(v\) 的鳥和編號為 \(u\) 的鳥某一時刻處在同一位置,它們就會互相鼓勵,增加各自的士氣值和團結值。

乙隻鳥的士氣值等於此刻與它處在同一位置的鳥中的威武值的最大值,團結值等於此刻與它處在同一位置的鳥的隻數。如果每一時刻都沒有鳥與它處在同一位置,則士氣值和團結值都為 \(0\) 。要注意自己不能鼓勵自己,計算士氣值和團結值時不能算上自己。

t 秒鐘後,doyouloveme 目測出了現在每只鳥的戰鬥力,於是感嘆了一句:「不妙,我們得走了。」

正所謂團結的鳥兒乙個頂倆,所以 doyouloveme 這樣描述戰鬥力:乙隻鳥戰鬥力值等於它在 \(0\) 到 \(t\) 秒中士氣值的最大值與團結值的最大值的乘積。注意不是乘積的最大值,而是最大值的乘積。

vfleaking 很想知道現在每只鳥的戰鬥力,但是他當然不會啦,於是他把這個任務交給了你來完成。

對座標進行離散化,對每乙個位置建立splay, 之後只要維護最大值,次大值,和鳥的個數即可。

這個東西的話由於使用 map 的話一次儲存 \(2\) 個點會超時,所以考慮兩個點壓成乙個點儲存,也即弄成: \((x,y) = x \times p + y\) (其中, \(p\) 是乙個很大的數)

剩下直接用模板即可。

#include #pragma gcc optimize(2)

#define maxn 1000001

#define p 1e9

using namespace std;

int n, m, cnt, w[maxn], ans[maxn], ans2[maxn], ss[maxn];

inline int read()

while ('0' <= c && c <= '9')

if (f)

return x;

}templateinline t m_max(t x,t y)

struct dian ;

bool operator < (dian a, dian b)

return a.y < b.y;

}unordered_map mp;

struct treap

inline int sz()

inline void reval(int x,int y)

inline void mt()

inline void dn()

inline void rotate(treap*& now,int d)

inline void insert(treap*& now,int x)

now->dn();

int d;

if(w[x]v]||(w[x]==w[now->v]&&xv)) d=0; else d=1;

insert(now->ch[d],x);

if(now->ch[d]->r < now->r) rotate(now,d^1);

now->mt();

} inline void del(treap*& now,int x) else

} else

if(now) now->mt();

} inline int gmax(treap* now)

} *root[maxn];

int main()

int now = mp[x];

ss[i] = now;

if (root[now])

root[now] -> insert(root[now], i);

root[now] -> reval(0, root[now] -> sz() - 1);

}scanf("%d", &m);

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

int now = mp[x];

root[ss[d]] -> del(root[ss[d]], d);

ss[d] = now;

if (root[now])

root[now] -> insert(root[now], d);

root[now] -> reval(0, root[now] -> sz() - 1);

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

for (int i = 1; i <= n; ++i)

}

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...