hdu 5692 (dfs序+線段樹)
阿新 • • 發佈:2019-02-13
wange2014 | We have carefully selected several similar problems for you: 5932 5931 5930 5929 5928
題解:萬萬沒想到會爆int,導致查了好久的錯,
先用dfs處理出一個從0到每個點的距離,那麼經過一個點的最大值就是它的最大的某個子節點到0的距離,於是利用dfs序把題目改成線段樹的區間更新和查詢問題
程式碼
題解:萬萬沒想到會爆int,導致查了好久的錯,
先用dfs處理出一個從0到每個點的距離,那麼經過一個點的最大值就是它的最大的某個子節點到0的距離,於是利用dfs序把題目改成線段樹的區間更新和查詢問題
程式碼
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; #define MAXN 100005 long long l[MAXN],r[MAXN],pre[MAXN],a[MAXN],add[MAXN*4],info[MAXN],nd[MAXN]; vector<long long> to,nxt; struct node { long long v,left,right; }tree[4*MAXN]; void push_down(long long x) { if(add[x]) { tree[x*2].v+=add[x]; tree[x*2+1].v+=add[x]; add[x*2]+=add[x]; add[x*2+1]+=add[x]; add[x]=0; } } void build(long long id,long long l,long long r) { tree[id].left=l,tree[id].right=r; if(l==r) { tree[id].v=pre[nd[l]]; return; } long long mid=(tree[id].left+tree[id].right)/2; build(id*2,l,mid); build(id*2+1,mid+1,r); tree[id].v=max(tree[id*2].v,tree[id*2+1].v); } void update(long long id,long long l,long long r,long long x) { if(tree[id].left==l&&tree[id].right==r) { tree[id].v+=x; add[id]+=x; return; } push_down(id); long long mid=(tree[id].left+tree[id].right)/2; if(mid<l) update(id*2+1,l,r,x); else if(mid>=r) update(id*2,l,r,x); else { update(id*2,l,mid,x); update(id*2+1,mid+1,r,x); } tree[id].v=max(tree[id*2].v,tree[id*2+1].v); } long long query(long long id,long long L,long long R) { if(tree[id].left==L&&tree[id].right==R) { return tree[id].v; } push_down(id); long long mid=(tree[id].left+tree[id].right)/2; if(mid<L) return query(id*2+1,L,R); else if(mid>=R) return query(id*2,L,R); else return max(query(id*2,L,mid),query(id*2+1,mid+1,R)); } void Add(long long a,long long b) { to.push_back(b); nxt.push_back(info[a]); info[a]=to.size()-1; } long long cnt; void dfs(long long x,long long fa) { cnt++; l[x]=cnt; nd[cnt]=x; for(long long i=info[x];i!=-1;i=nxt[i]) { if(to[i]!=fa) { pre[to[i]]=pre[x]+a[to[i]]; dfs(to[i],x); } } r[x]=cnt; } void init() { cnt=0; memset(info,-1,sizeof(info)); memset(add,0,sizeof(add)); to.clear(); nxt.clear(); } int main() { long long t; long long cas=1; scanf("%I64d",&t); while(cas<=t) { init(); long long n,m; scanf("%I64d%I64d",&n,&m); for(long long i=0;i<n-1;i++) { long long a,b; scanf("%I64d%I64d",&a,&b); Add(a,b); Add(b,a); } for(long long i=0;i<n;i++) scanf("%I64d",&a[i]); pre[0]=a[0]; dfs(0,-1); build(1,1,n); printf("Case #%I64d:\n",cas++); for(long long i=0;i<m;i++) { long long op; scanf("%I64d",&op); if(op==0) { long long x,y; scanf("%I64d%I64d",&x,&y); update(1,l[x],r[x],y-a[x]); a[x]=y; } else { long long x; scanf("%I64d",&x); long long ans=query(1,l[x],r[x]); printf("%I64d\n",ans); } } } return 0; }