[luogu P2590 ZJOI2008] 樹的統計 (樹鏈剖分)

題目描述
一棵樹上有n個節點,編號分別為1到n,每個節點都有一個權值w。

我們將以下面的形式來要求你對這棵樹完成一些操作:

I. CHANGE u t : 把結點u的權值改為t

II. QMAX u v: 詢問從點u到點v的路徑上的節點的最大權值

III. QSUM u v: 詢問從點u到點v的路徑上的節點的權值和

注意:從點u到點v的路徑上的節點包括u和v本身

輸入輸出格式
輸入格式:
輸入文件的第一行為一個整數n,表示節點的個數。

接下來n – 1行,每行2個整數a和b,表示節點a和節點b之間有一條邊相連。

接下來一行n個整數,第i個整數wi表示節點i的權值。

接下來1行,為一個整數q,表示操作的總數。

接下來q行,每行一個操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式給出。

輸出格式:
對于每個“QMAX”或者“QSUM”的操作,每行輸出一個整數表示要求輸出的結果。

輸入輸出樣例
輸入樣例#1:
4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
輸出樣例#1:
4
1
2
2
10
6
5
6
5
16
說明
對于100%的數據,保證1<=n<=30000,0<=q<=200000;中途操作中保證每個節點的權值w在-30000到30000之間。

樹鏈剖分模板。。。
code:

//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#define ll long long
#define f(a,b,c) for(int a=b;a<=c;a++)
using namespace std;inline ll rd() {ll x=0,fla=1; char c=' ';while(c>'9' || c<'0') {if(c=='-') fla=-fla; c=getchar();}while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*fla;
}inline void out(ll x){int a[25],wei=0;if(x<0) putchar('-'),x=-x;for(;x;x/=10) a[++wei]=x%10;if(wei==0){ puts("0"); return;}for(int j=wei;j>=1;--j) putchar('0'+a[j]);putchar('\n');
}const int MAX=300100;//直接開了十倍qwq
const int INF=0x3f3f3f3f;
int n,cnt,N;int head[MAX],W[MAX],size[MAX],h[MAX],fa[MAX],son[MAX];
//W 點權 size 樹的大小 h 深度 fa 父親 son 重兒子 int num[MAX],top[MAX],tree[MAX],maxn[MAX],sumn[MAX];
//num 在線段樹編號 top 鏈最上面的點 tree 線段樹編號對應的點 struct edges{int next,to;
}edge[MAX]; void add(int a,int b) {edge[++cnt]=(edges) {head[a],b}; head[a]=cnt;edge[++cnt]=(edges) {head[b],a}; head[b]=cnt;
}void dfs1(int u,int pre,int dep) {size[u]=1; h[u]=dep; fa[u]=pre;//initint mason=0;for(int i=head[u];i;i=edge[i].next) if(edge[i].to!=pre) {int v=edge[i].to;dfs1(v,u,dep+1);size[u]+=size[v];if(size[v]>mason) {mason=size[v];son[u]=v;}}
}void dfs2(int u,int pre) {if(son[pre]!=u) top[u]=u;else top[u]=top[pre];num[u]=++N;if(son[u]) dfs2(son[u],u);for(int i=head[u];i;i=edge[i].next)if(edge[i].to!=pre && edge[i].to !=son[u])dfs2(edge[i].to,u);
}void build_sum(int cur,int l,int r) {if(l==r) {sumn[cur]=W[tree[l]];return ;}int mid=(l+r)>>1;build_sum(cur<<1,l,mid);build_sum(cur<<1|1,mid+1,r);sumn[cur]=sumn[cur<<1]+sumn[cur<<1|1];//update_sum
}void build_max(int cur,int l,int r) {if(l==r) {maxn[cur]=W[tree[l]];return ;}int mid=(l+r)>>1;build_max(cur<<1,l,mid);build_max(cur<<1|1,mid+1,r);maxn[cur]=max(maxn[cur<<1],maxn[cur<<1|1]);//update_max
}void po_ch_sum(int cur,int l,int r,int x,int v) {//point_change_sumif(l==r) {sumn[cur]=v;return ;}int mid=(l+r)>>1;if(x<=mid) po_ch_sum(cur<<1,l,mid,x,v);else po_ch_sum(cur<<1|1,mid+1,r,x,v);sumn[cur]=sumn[cur<<1]+sumn[cur<<1|1];//update_sum
}void po_ch_max(int cur,int l,int r,int x,int v) {//point_change_maxif(l==r) {maxn[cur]=v;return ;}int mid=(l+r)>>1;if(x<=mid) po_ch_max(cur<<1,l,mid,x,v);else po_ch_max(cur<<1|1,mid+1,r,x,v);maxn[cur]=max(maxn[cur<<1],maxn[cur<<1|1]);
}int query_sum(int cur,int l,int r,int L,int R) {if(L<=l&&r<=R) return sumn[cur];int mid=(l+r)>>1,ans=0;if(L<=mid) ans+=query_sum(cur<<1,l,mid,L,R);if(R>mid) ans+=query_sum(cur<<1|1,mid+1,r,L,R);return ans;
}int query_max(int cur,int l,int r,int L,int R) {if(L<=l&&r<=R) return maxn[cur];int mid=(l+r)>>1,ans=-INF;if(L<=mid) ans=max(ans,query_max(cur<<1,l,mid,L,R));if(R>mid) ans=max(ans,query_max(cur<<1|1,mid+1,r,L,R));return ans;
}void INIT() {dfs1(1,0,1);// size h fa sondfs2(1,0);//top numf(i,1,n) tree[num[i]]=i;//tree//建樹: build_sum(1,1,N);build_max(1,1,N);
}void solve() {int q=rd(),a,b,ans=0,f1,f2;char opt[6];f(i,1,q) {scanf("%s",opt);a=rd(),b=rd(),ans=0;if(opt[0]=='C') {//HCANGEpo_ch_sum(1,1,N,num[a],b);po_ch_max(1,1,N,num[a],b);}else {f1=top[a],f2=top[b];if(opt[1]=='M') ans=-INF;while(f1!=f2) {if(h[f1]<h[f2]) {swap(a,b);swap(f1,f2);}if(opt[1]=='S') ans+=query_sum(1,1,N,num[f1],num[a]);else ans=max(ans,query_max(1,1,N,num[f1],num[a]));a=fa[f1];f1=top[a];}if(num[a]>num[b]) swap(a,b);if(opt[1]=='S') ans+=query_sum(1,1,N,num[a],num[b]);else ans=max(ans,query_max(1,1,N,num[a],num[b]));out(ans);}}
}int main() {n=rd();f(i,1,n-1) add(rd(),rd());f(i,1,n) W[i]=rd();INIT();solve();return 0;
}

轉載于:https://www.cnblogs.com/Menteur-Hxy/p/9247981.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452838.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452838.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452838.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jetty xml解析

1 configure configure為xml的根結點&#xff0c;class指定所配置的對象的類&#xff0c;這個configure會創建一個該類的對象&#xff0c;然后根據該xml對其進行配置。id用來對該對象進行標識&#xff0c;在整個jetty中具有唯一性&#xff0c;相同id的xml configure文件配置的是…

java 歌詞_請問吧內有大神用JAVA做過桌面歌詞嗎

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓寫了個簡單的例子給你&#xff1a;public class TextChangePane extends JComponent implements ActionListener {private static final int CYCLE_TIME 10000;private long startTime 0;private long nowTime 0;private float …

組播相對于單播和廣播的優勢

組播協議允許將一臺主機發送的數據通過網絡路由器和交換機復制到多個加入此組組播協議。 與現在廣泛使用的單播協議的不同之處在于&#xff0c;一個主機用單播協議向n個主機發送相同的數據時&#xff0c;發送主機需要分別向n個主機發送&#xff0c;共發送n次。一個主機用組播協…

安裝nginx及fastdfs-nginx-module

1.先了解背景&#xff1a; FastDFS為什么要結合Nginx以及FastDFS原理&#xff0c;請參考文章&#xff1a; FastDFS為什么要結合Nginx以及FastDFS原理 2.準備工作&#xff1a; 安裝安裝Nginx所需的環境&#xff0c;參考文獻&#xff1a;Ubuntu 18.04.1安裝Nginx apt install …

如何讓自己的內心強大起來

內心強大的人是指一個人的精神境界達到了一定的級別&#xff01;以至于讓人們折服&#xff01; 世界上有這么一種人&#xff0c;似乎特別得到老天爺的偏愛——他總是有自己的理想&#xff0c;并且總是努力去做&#xff0c;最重要的是&#xff0c;老天爺每一次都會幫他取得成功…

什么是軟件工程

軟件工程是指導計算機軟件開發和維護的一門工程學科。采用工程的概念、原理、技術和方法來開發與維護軟件&#xff0c;把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來&#xff0c;以經濟地開發出高質量的軟件并有效地維護它&#xff0c;這就是軟件…

linux下的靜態庫與動態庫

目錄 靜態庫定義&#xff1a;生成及使用方法&#xff1a;靜態庫的優缺點動態庫定義&#xff1a;生成及使用方法&#xff1a;動態庫優缺點&#xff1a;靜態庫 先說說我們為什么需要庫&#xff1f; 當有些代碼我們大量會在程序中使用比如&#xff08;scanf&#xff0c;printf等&a…

esrgan_ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks【閱讀筆記】

針對SRGAN提出的幾點改進&#xff0c;獲得了PIRM2018視覺質量的第一名。首先是使用去掉BN層的Residual in Residual Dense Block作為網絡的basic unit。并且使用residual scling 和 smaller initialization幫助訓練更深的網絡。第二點改進是使用了Relativistic Discriminator來…

PostgreSQL Frontend/Backend protocol (通信協議)

標簽 PostgreSQL , protocol , proxy , 通信協議 背景 理解PostgreSQL的通信協議可以更好的開發類似SQL代理&#xff0c;SQL中間件&#xff0c;SQL防火墻&#xff0c;連接池等軟件。 學習資料與軟件 《PostgreSQL 讀寫分離代理 - Crunchy Proxy(base on golang)》 Postgres on …

啟動FastDFS服務,使用python客戶端對接fastdfs完成上傳測試

1.啟動tracker、storage、nginx服務&#xff1a; 啟動fdfs_trackerd&#xff1a;sudo service fdfs_trackerd start 啟動fdfs_storaged &#xff1a;sudo service fdfs_storaged start 啟動Nginx&#xff1a;sudo /usr/local/nginx/sbin/nginx 注&#xff1a;此處給出重啟服務…

軟件工程方法學

傳統方法學 傳統方法學也稱為生命周期方法學或結構化范型。它采用結構化技術(結構化分析、結構化設計和結構化實現)來完成軟件開發的各項任務&#xff0c;并使用適當的軟件工具或軟件工程環境來支持結構化技術的運用。 面向對象方法學 與傳統方法相反&#xff0c;面向對象方…

我做項目這些年的經驗

1、中國充滿大量非常敬業但不夠職業的項目經理&#xff0c;不了解這一點&#xff0c;就做不好中國的項目。 2、真正的原因往往都隱藏在表面的理由背后。 3、做項目最高境界是和用戶形成長期共生雙贏關系。 4、賣功能&#xff0c;賣利益&#xff0c;賣服務&#xff0c;賣價值…

Python學習-終端字體高亮顯示

1、采用原生轉義字符序列&#xff0c;對Windows有的版本不支持&#xff08;比如win7&#xff09;&#xff0c;完美支持Linux 實現過程&#xff1a; 終端的字符顏色是用轉義序列控制的&#xff0c;是文本模式下的系統顯示功能&#xff0c;和具體的語言無關。 轉義序列是以ESC開頭…

Win32-Application的窗口和對話框

Win32 Application&#xff0c;沒有基于MFC的類庫&#xff0c;而是直接調用C接口來編程。 一、彈出消息窗口 &#xff08;1&#xff09;最簡單的&#xff0c;在當前窗口中彈出新窗口。新窗口只有“YES”按鈕。 int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstan…

Python面試題總結(4)--數據類型(列表)

1. 已知 AList [1,2,3,1,2]&#xff0c;對 AList 列表元素去重&#xff0c;寫出具體過程。 答&#xff1a; AList [1,2,3,1,2] BList set(AList)print(BList) print(list(BList))輸出結果&#xff1a; {1, 2, 3} [1, 2, 3]2. 如何實現 “1,2,3” 變成 [“1”,“2”,“3”…

項目團隊要以十當一

如何建立起一支高效的團隊&#xff0c;并有效的管理團隊&#xff0c;一直是IT項目經理津津樂道的話題。任何一個IT項目經理對此都有自己一番不同的見解&#xff0c;根據自己團隊特點&#xff0c;項目經理正在用自身獨有的管理藝術改變著自己的團隊。項目團隊要以十當一&#xf…

Centos中配置環境變量

以Java的開發環境Jdk為例。 將jdk-9.0.1放置在/usr/local下&#xff08;UNIX規范&#xff09;&#xff0c;然后我們將jdk配置到環境變量中去。 $ mv jdk-9.0.1 /usr/local $ vim /etc/profile 修改 /etc/profile &#xff0c;最底部加入以下內容 export JAVA_HOME/usr/local/jd…

python面試題總結(5)--數據類型(字典)

1. 字典操作中 del 和 pop 有什么區別 答&#xff1a;del 可以根據索引&#xff08;元素所在位置&#xff09;來刪除的&#xff0c;沒有返回值。 pop 可以根據索引彈出一個值&#xff0c;然后可以接收它的返回值。 參考一 參考二 2. 按照字典的內的年齡排序 d1 [ {‘name’…

js下載文件 java_[Java教程]使用js實現點擊按鈕下載文件

[Java教程]使用js實現點擊按鈕下載文件0 2016-11-11 19:02:54有時候我們在網頁上需要增加一個下載按鈕&#xff0c;讓用戶能夠點擊后下載頁面上的資料&#xff0c;那么怎樣才能實現功能呢&#xff1f;這里有兩種方法&#xff1a;現在需要在頁面上添加一個下載按鈕&#xff0c;點…