題意就是根節點到
i 子樹上所有點的最大值,並且這棵樹上的點權可修改。
那麼維護所有點到根的和,如果修改乙個
u節點,只會改變根到
u 子樹上點的和。把樹用df
s序遍歷一下,把樹變成乙個序列,修改節點就變成了序列的區間修改,找最大值也變成了區間找最值。一棵線段樹搞定了。
複雜度:o(
mlog
n)
#pragma comment(linker, "/stack:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
typedef
vector
vi;
typedef pair pii;
#define for(i,x,y) for(int i = x;i < y;++ i)
#define ifor(i,x,y) for(int i = x;i > y;-- i)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define lrt rt<<1
#define rrt rt<<1|1
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
const
int maxn = 200010;
vi mat[maxn];
ll a[maxn],suf[maxn],w[maxn];
int n,m;
int tot,dfn[maxn],s[maxn],t[maxn];
void dfs(int u,int fa)
dfn[++tot] = u; t[u] = tot; w[tot] = suf[u];
}struct treetree[maxn<<2];
void pushup(int rt)
void pushdown(int rt)
}void build(int rt,int l,int r)
int mid = (l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}void modify(int rt,int l,int r,int lazy)
pushdown(rt);
int mid = (tree[rt].l+tree[rt].r)>>1;
if(r <= mid) modify(lrt,l,r,lazy);
else
if(l > mid) modify(rrt,l,r,lazy);
else
pushup(rt);
}ll query(int rt,int l,int r)
void work()
else
}}int main()
return
0;}
hdu5692 Snacks 線段樹 dfs序
我們維護每個點到根的權值和。詢問過x的路徑中權值最大的,即詢問x的子樹中到根的距離最大的。修改x為y,則x的子樹中的所有點到根的距離都加上了y a x 顯然可以用dfn變成連續區間用線段樹來維護。pragma comment linker,stack 1024000000,1024000000 in...
android 百度sdk之 百度定位
步驟 1.控制台建立應用。2.sha1獲得 注意 debug 版本和release不同。debug版本獲取 首先 到c user android目錄下,我的是 c users admin android 其次 在這個目錄下,用cmd.輸入keytool v list keystore debug.k...
百度官方工具 百度站長平台
1 的提交和驗證 2 死鏈結提交 再也不用使用robots乙個乙個遮蔽死鏈結,直接在站長平台提交死鏈結就可以,如果死鏈結過多可以做成文件的形式,直接提交文件在根目錄的路徑就可以了。3 改版 改版功能是提供給站長改版時新老路徑替換的功能,方便將曾經的路徑跳轉到新的路徑,並且傳遞老路徑的權重。5 外鏈分...