hdu5692 dfs序線段樹

2022-03-15 23:36:44 字數 1857 閱讀 5210

這是補的知識點,按先序遍歷的順序建立dfs序,用左右兩個值代表整個區間,因為dfs序最重要的特點就是子樹的區間是連續的

建立線段樹時,需要用重新標過的 下標來建立

#pragma comment(linker, "/stack:1024000000,1024000000")#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

#define mp make_pair

#define pb push_back

#define pii pair#define pil pair#define c 0.5772156649

#define pi acos(-1.0)

#define ll long long

#define mod 1000000007

#define ls l,m,rt<<1

#define rs m+1,r,rt<<1|1

using

namespace

std;

const

double g=10.0,eps=1e-12

;const

int n=100000+10,maxn=90000+10,inf=0x3f3f3f3f

;struct

edgee[n*2

];int

cnt,head[n];

void add(int u,int

v)int

l[n],r[n],id[n],num;

ll a[n],d[n];

void dfs(int u,int

f) r[u]=num;

}ll lazy[n*4],sum[n*4

];void pushup(int

rt)void pushdown(int

rt)}

void build(int l,int r,int

rt)

int m=(l+r)>>1

; build(ls);

build(rs);

pushup(rt);

}void update(int l,int r,int v,int l,int r,int

rt)

//if(l==r)return ;

pushdown(rt);

int m=(l+r)>>1

;

if(l<=m)update(l,r,v,ls);

if(r>m)update(l,r,v,rs);

pushup(rt);

}ll query(

int l,int r,int l,int r,int

rt)int

main()

for(int i=0; i"

%i64d

",&a[i]);

d[0]=a[0],num=0

; dfs(

0,-1

); build(

1,n,1

);

while(m--)

else

//for(int i=0;i}

}return0;

}/********************

*******************

*/

view code

hdu5692 Snacks 線段樹 dfs序

我們維護每個點到根的權值和。詢問過x的路徑中權值最大的,即詢問x的子樹中到根的距離最大的。修改x為y,則x的子樹中的所有點到根的距離都加上了y a x 顯然可以用dfn變成連續區間用線段樹來維護。pragma comment linker,stack 1024000000,1024000000 in...

HDU 5692 Snacks dfs序 線段樹

由於零食被頻繁的消耗和補充,零食機的價值v會時常發生變化。小度熊只能從編號為0的零食機出發,並且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。為小度熊規劃乙個路線,使得路線上的價值總和最大。輸入資料第一行是乙個整數t t 10 表示有t組測試資料。對於...

HDU 5692 Snacks dfs序 線段樹

會時常發生變化。小度熊只能從編號為0的零食機出發,並且每個零食機至多經過一次。另外,小度熊會對某個零食機的零食有所偏愛,要求路線上必須有那個零食機。為小度熊規劃乙個路線,使得路線上的價值總和最大。input 輸入資料第一行是乙個整數t t 10 表示有t組測試資料。對於每組資料,包含兩個整數n,m ...