DFS 序 1 (Loj#144)
阿新 • • 發佈:2018-11-19
但是 spa algorithm pda algo oid fine ret long
又到了快樂的板子題時間了!!!QwQ
顯然這道題用線段樹是可以做的 ,
但是蒟蒻的我還是想用樹狀數組寫(好吧還是因為太懶了)
所以就變成了一個樹狀數組的單點修改+區間查詢+跑一個DFS的題目
代碼如下
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<vector> #define LL long long using namespace std; const int maxn=1e6+5; int n,m,R,x,y; LL c[maxn],a[maxn],r[maxn],l[maxn]; LL ans=0; vector<int>g[maxn]; int lowbit(int x){ return x&(-x); } void update(int x,int v){ for(int i=x;i<=n;i+=lowbit(i)){ c[i]+=v; } } LL query(int x){ LL ans=0; for(int i=x;i>0;i-=lowbit(i)){ ans+=c[i]; } return ans; } void dfs(int u,int fa){ l[u]=++ans; update(ans,a[u]); for(int i=0;i<g[u].size();i++){ int x=g[u][i]; if(x==fa)continue; dfs(x,u); } r[u]=ans; } int main(){ scanf("%d%d%d",&n,&m,&R); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<n;i++){ int u,v;scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } dfs(R,0); for(int i=1;i<=m;i++){ int x,y,z;scanf("%d",&x); if(x==1){ scanf("%d%d",&y,&z); update(l[y],z); } else{ scanf("%d",&y); ans=query(r[y])-query(l[y]-1); printf("%lld\n",ans); } } return 0; }
DFS 序 1 (Loj#144)