這是補的知識點,按先序遍歷的順序建立dfs序,用左右兩個值代表整個區間,因為dfs序最重要的特點就是子樹的區間是連續的
建立線段樹時,需要用重新標過的 下標來建立
#pragma comment(linker, "/stack:1024000000,1024000000")#includeview code#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;
}/********************
*******************
*/
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 ...