JLOI2015 城池攻占

2021-08-17 06:32:00 字數 1132 閱讀 4649

霧.

改變操作乘法是沒有負數的,那麼就不會改變大小關係,我們就可以dfs樹,然後用可合併堆進行操作。

splay+啟發式合併也可以過

luogu 3261

bzoj 4003

#include 

#include

#include

#define int long long

const int maxm=310000

;struct left_treest[maxm];

int begin[maxm],end[maxm],dead[maxm],deep[maxm];

int rt[maxm];

int flag[maxm],v[maxm],d[maxm];

int n,m;

int head[maxm],net[maxm],to[maxm],cnt;

inline void addedge(int u,int v)

inline void col(int o,int addi,int addx)

inline void pushdown(int o)

int merge(int x,int y)

inline int pop(int o)

void dfs(int now,int fa)

if(!flag[now]) col(rt[now],v[now],1);

else col(rt[now],0,v[now]);

}main()

for(int i=1

;i<=m;i++) st[i].adi=0,st[i].adx=1;

for(int i=1

;i<=m;i++)

//for(int i=1

;i<=n;i++) printf("%d\n",st[rt[i]].v);

dfs(1,0);

for(int i=1

;i<=n;i++) printf("%lld\n",dead[i]);

for(int i=1

;i<=m;i++) printf("%lld\n",deep[begin[i]]-deep[end[i]]);

return 0

;}

JLOI2015 城池攻占

點此看題 先把每個人放到對應的點上,可以用左偏樹,然後從下往上合併,每次就刪除當前節點會犧牲的人,然後維護乙個 加法 乘法 標記,時間複雜度o n log n o n log n o nlogn include include using namespace std define int long ...

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