JLOI2015 城池攻占

2021-10-04 17:33:32 字數 1277 閱讀 8816

點此看題

先把每個人放到對應的點上,可以用左偏樹,然後從下往上合併,每次就刪除當前節點會犧牲的人,然後維護乙個 加法/

//乘法 標記,時間複雜度o(n

log⁡n)

o(n\log n)

o(nlogn)

#include

#include

using

namespace std;

#define int long long

const

int m =

300005

;int

read()

int n,m,tot,f[m]

,h[m]

,fl[m]

,a[m]

,dep[m]

,a1[m]

,a2[m]

,c[m]

;int val[m]

,dis[m]

,ls[m]

,rs[m]

,mul[m]

,add[m]

,rt[m]

;struct edge

}e[2

*m];

void

upd(

int x,

int y,

int z)

void

down

(int x)

intmerge

(int x,

int y)

void

dfs(

int u,

int fa)

while

(rt[u]

&& val[rt[u]

](fl[u]

)upd

(rt[u]

,a[u],0

);else

upd(rt[u],1

,a[u]);

}signed

main()

for(

int i=

1;i<=m;i++

)dfs(1

,0);

while

(rt[1]

)for

(int i=

1;i<=n;i++

)printf

("%lld\n"

,a1[i]);

for(

int i=

1;i<=m;i++

)printf

("%lld\n"

,a2[i]);

}

JLOI2015 城池攻占

霧.改變操作乘法是沒有負數的,那麼就不會改變大小關係,我們就可以dfs樹,然後用可合併堆進行操作。splay 啟發式合併也可以過 luogu 3261 bzoj 4003 include include include define int long long const int maxm 3100...

JLOI2015 城池攻占

原題位址 首先發現乘的時候 係數不會為負,所以能得到乙個關鍵條件 變化後的戰鬥力隨變化前的戰鬥力大小單調 所以我們考慮倍增 設hp x i 是從x開始一路攻克 2 i 個城池所需要最小的初始生命值 設trans x i 0 1 是攻克了 2 i 個城池後攻擊力的變化量,0表示乘,1表示加,先乘後加 ...

JLOI2015 城池攻占

左偏樹的題。把每個節點上有的騎士按照攻擊力的大小建乙個小根堆。dfs的時候把兒子們的都合併過來,看看update完了的值是否小於防禦值。小於的話就pop,然後ans x 記得開long long include include include using namespace std define i...