description
input
output
sample input
5 5sample output50 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
220data constraint0011311
首先一條鏈的資料我們可以用堆自下而上維護還活首的騎士,判斷攻擊力最小的能否攻破,能則給堆打整體標記
由鏈推廣到樹,我們把堆變成可並堆即可
#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表示加,先乘後加 ...