JLOI2015 城池攻占

2022-08-25 22:15:23 字數 1420 閱讀 7363

description

input

output

sample input

5 5

50 20 10 10 30

1 1 2

2 0 5

2 0 -10

1 0 10

20 2

10 3

40 4

20 4

35 5

sample output

220

0011311

data constraint

首先一條鏈的資料我們可以用堆自下而上維護還活首的騎士,判斷攻擊力最小的能否攻破,能則給堆打整體標記

由鏈推廣到樹,我們把堆變成可並堆即可

#include#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;vector

v[300011

];struct

node

};node *root[300011

];int que[300011],g[300011],next[300011],y[300011],f[300011],a[300011

];ll vs[

300011],h[300011],atk[300011

];int st[300011],dep[300011],ciy[300011],scr[300011

];int

n,m,tt,i;

void star(int i,int

j)void

bfs()

l++;

}}void change(node *&a,ll x,ll z)

if(x)

}void down(node *a)

}node *merge(node *a,node *b)

void add(intx)}

void

work()

else

break

; }

if(root[x]!=null)

}while(root[1]!=null)

for(i=1;i<=n;i++)printf("

%d\n

",scr[i]);

for(i=1;i<=m;i++)printf("

%d\n

",ciy[i]);

}int

main()

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

bfs();

work();

}

JLOI2015 城池攻占

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

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表示加,先乘後加 ...