點此看題
先把每個人放到對應的點上,可以用左偏樹,然後從下往上合併,每次就刪除當前節點會犧牲的人,然後維護乙個 加法/
//乘法 標記,時間複雜度o(n
logn)
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...