霧.
改變操作乘法是沒有負數的,那麼就不會改變大小關係,我們就可以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...