YbtOJ 763 攻城略池

2022-06-13 13:48:07 字數 1103 閱讀 3609

設 \(f_x\) 是點 \(x\) 被攻占的時間。顯然這個值可以二分,然後枚舉子樹內的每乙個點,計算在二分到的時間內從列舉到的點可以過去多少人。

在 \(mid\) 時間內會被攻占當且僅當

\[d_x\leq \sum_(x)}\max(mid-f_y-(\text_y-\text_x),0)

\]\[c\times mid-v

然後往上的時候線段樹合併就可以了。

線段樹值域上界是 \(3\times 10^8\),動態開點就可以了。

時間複雜度 \(o(n\log (d+nl))\)。

#include using namespace std;

typedef long long ll;

const int n=100010,lg=30,maxn=n*lg*4,lim=3e8;

int n,ans,tot,a[n],head[n],dep[n],rt[n],f[n];

struct edge

e[n*2];

void add(int from,int to,int dis)

; head[from]=tot;

}struct segtree

int update(int x,int l,int r,int v)

int query(int x,int l,int r,int k,int c,ll s)

}seg;

void dfs(int x,int fa)

} f[x]=max(seg.query(rt[x],0,lim,x,0,0)-dep[x],0);

rt[x]=seg.update(rt[x],0,lim,f[x]+dep[x]);

ans=max(ans,f[x]);

}signed main()

dfs(1,0);

printf("%lld",ans);

return 0;

}

YbtOJ 763 攻城略池 線段樹合併

給出n nn個點的一棵樹,每個di 0d i 0 di 0的點每秒會產生乙個士兵往根節點走,走到乙個節點讓乙個節點d id i di 減一 為0 00就不管 求需要多久才能讓所有點的d dd值變為000 1 n 105 1 d i 10 81 leq n leq10 5,1 leq d i leq ...

YbtOJ 763 攻城略池 線段樹合併

給出 n 個點的一棵樹,每個 d i 0 的點每秒會產生乙個士兵往根節點走,走到乙個節點讓乙個節點 d i 減一 為 0 就不管 求需要多久才能讓所有點的 d 值變為 0 1 leq n leq10 5,1 leq d i leq 10 8 考慮求出每個點 d i 值變成 0 的時間 t i 對於乙...

hiho1160 攻城略地

題意 給出乙個圖,每個點有乙個權值,破壞這個點需要花費這個點的權值,你的任務是破壞所有的點,若破壞某個點之前它的相鄰點已經被破壞,那麼它就不需要花費代價,求破壞所有點的最小代價 題解 帶權並查集 破壞乙個點後,則這個點所在連通塊的所有點就會被破壞,那麼每個連通塊都破壞其代價最小的點 若破壞的邊不足k...