HDU 3966 Aragorn's Story (樹鏈點權剖分,成段修改單點查詢)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3966

樹鏈剖分的模版,成段更新單點查詢。熟悉線段樹的成段更新的話就小case啦。

  1 //樹鏈剖分 邊權修改 單點查詢
  2 #include <iostream>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cstdio>
  6 using namespace std;
  7 const int MAXN = 5e4 + 10;
  8 struct data {
  9     int to , next;
 10 }edge[MAXN << 1];
 11 int head[MAXN] , cnt , tot;
 12 int top[MAXN] , par[MAXN] , son[MAXN] , size[MAXN] , dep[MAXN];
 13 int id[MAXN] , fid[MAXN]; //id[i]表示i對應在線段樹上的位置 fid[i]表示線段樹位置是i的葉子 對應的節點 
 14 int a[MAXN];
 15 
 16 void init() {
 17     tot = cnt = 0;
 18     memset(head , -1 , sizeof(head));
 19 }
 20 
 21 inline void add(int u , int v) {
 22     edge[tot].next = head[u];
 23     edge[tot].to = v;
 24     head[u] = tot++;
 25 }
 26 
 27 void dfs1(int u , int p , int d) {
 28     dep[u] = d , size[u] = 1 , son[u] = u , par[u] = p;
 29     for(int i = head[u] ; ~i ; i = edge[i].next) {
 30         int v = edge[i].to;
 31         if(v == p)
 32             continue;
 33         dfs1(v , u , d + 1);
 34         if(size[v] >= size[son[u]] || son[u] == u)
 35             son[u] = v;
 36         size[u] += size[v];
 37     }
 38 }
 39 
 40 void dfs2(int u , int p , int t) {
 41     top[u] = t , id[u] = ++cnt;
 42     fid[cnt] = u;
 43     if(son[u] != u)
 44         dfs2(son[u] , u , t);
 45     for(int i = head[u] ; ~i ; i = edge[i].next) {
 46         int v = edge[i].to;
 47         if(v == p || v == son[u])
 48             continue;
 49         dfs2(v , u , v);
 50     }
 51 }
 52 
 53 struct segtree {
 54     int l , r;
 55     int sum;
 56 }T[MAXN << 2];
 57 
 58 void pushup(int p) {
 59     if(T[p].sum != 0) {
 60         int ls = p << 1 , rs = (p << 1)|1;
 61         T[ls].sum += T[p].sum;
 62         T[rs].sum += T[p].sum;
 63         T[p].sum = 0;
 64     }
 65 }
 66 
 67 void build(int p , int l , int r) {
 68     int mid = (l + r) >> 1;
 69     T[p].l = l , T[p].r = r;
 70     T[p].sum = 0;
 71     if(l == r) {
 72         T[p].sum = a[fid[l]]; //
 73         return ;
 74     }
 75     build(p << 1 , l , mid);
 76     build((p << 1)|1 , mid + 1 , r);
 77 }
 78 
 79 void updata(int p , int l , int r , int num) {
 80     int mid = (T[p].l + T[p].r) >> 1;
 81     if(T[p].l == l && T[p].r == r) {
 82         T[p].sum += num;
 83         return ;
 84     }
 85     pushup(p);
 86     if(r <= mid) {
 87         updata(p << 1 , l , r , num);
 88     }
 89     else if(l > mid) {
 90         updata((p << 1)|1 , l , r , num);
 91     }
 92     else {
 93         updata(p << 1 , l , mid , num);
 94         updata((p << 1)|1 , mid + 1 , r , num);
 95     }
 96 }
 97 
 98 int query(int p , int pos) {
 99     int mid = (T[p].l + T[p].r) >> 1;
100     if(T[p].l == T[p].r && T[p].r == pos) {
101         return T[p].sum;
102     }
103     pushup(p);
104     if(pos <= mid) {
105         return query(p << 1 , pos);
106     }
107     else {
108         return query((p << 1)|1 , pos);
109     }
110 }
111 
112 void change(int u , int v , int num) {
113     int fu = top[u] , fv = top[v];
114     int sum = 0;
115     while(fu != fv) {
116         if(dep[fu] > dep[fv]) {
117             updata(1 , id[fu] , id[u] , num);
118             u = par[fu];
119             fu = top[u];
120         }
121         else {
122             updata(1 , id[fv] , id[v] , num);
123             v = par[fv];
124             fv = top[v];
125         }
126     }
127     if(dep[u] >= dep[v]) {
128         updata(1 , id[v] , id[u] , num);
129     }
130     else {
131         updata(1 , id[u] , id[v] , num);
132     }
133 }
134 
135 int main()
136 {
137     int n , u , v , m , xx;
138     while(~scanf("%d %d %d" , &n , &xx , &m)) {
139         init();
140         for(int i = 1 ; i <= n ; ++i) {
141             scanf("%d" , a + i);
142         }
143         for(int i = 1 ; i < n ; ++i) {
144             scanf("%d %d" , &u , &v);
145             add(u , v);
146             add(v , u);
147         }
148         cnt = 0;
149         dfs1(1 , 1 , 0);
150         dfs2(1 , 1 , 1);
151         build(1 , 1 , cnt);
152         char q[10];
153         while(m--) {
154             scanf("%s" , q);
155             if(q[0] == 'Q') {
156                 scanf("%d" , &xx);
157                 printf("%d\n" , query(1 , id[xx]));
158             }
159             else if(q[0] == 'I') {
160                 scanf("%d %d %d" , &u , &v , &xx);
161                 change(u , v , xx);
162             }
163             else {
164                 scanf("%d %d %d" , &u , &v , &xx);
165                 change(u , v , -xx);
166             }
167         }
168     }
169     return 0;
170 }

?

轉載于:https://www.cnblogs.com/Recoder/p/5518179.html

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

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

相關文章

微信分享無響應的解決

微信分享無響應的解決 最近使用友盟的社會化分享&#xff0c;集成到程序中進行分享功能的開發。 可是一開始還是可以正常使用&#xff0c;今天突然發現微信分享&#xff08;好友分享和朋友圈分享&#xff09;均是點擊沒有響應&#xff0c;也就是點擊后&#xff0c;沒有任何回饋…

x64電腦連接x32共享打印機

下載64位打印機驅動到64位電腦&#xff0c;在連接32位共享打印機出錯時出現在本地尋找相關inf文件&#xff0c;此時將64位打印機驅動解壓(不在64位本地安裝)并找到相應inf文件&#xff0c;載入即可連接成功。

HTML中的br標簽講解(菜鳥)

br標簽&#xff1a;如何在HTML中換行&#xff1f;可以使用br標簽 1.br標簽作用&#xff1a;換行 2.br標簽格式&#xff1a;<br/> 3.br標簽的注意點&#xff1a; 3.1多個br標簽可以連續使用&#xff0c;使用了多少個br標簽就會換多少行 3.2由于HTML的作用就是用來給文本添…

Cocos2d-3.x版的HelloWorld工程分析 (二)

我們HelloWorld 從applicationDidFinishLaunching()后&#xff0c; 大部分人都會從這部分代碼開始研究&#xff0c;如果想要研究main函數 如何調用applicationDidFinishLaunching() 傳送門 http://blog.csdn.net/hiwoshixiaoyu/article/details/51472707 #include "App…

安卓中bundle的使用

Bundle類用作攜帶數據&#xff0c;它類似于Map&#xff0c;用于存放key-value形式的值&#xff0c;相對于Map&#xff0c;它提供了各種常用類型的putXxx()/getXxx()方法&#xff0c;Bundle的內部實際上是使用了HashMap類型的變量來存放PutXxx()方法存入的值。 SDK里是這樣描述&…

NO.1 python_人工智能_學習路線

***##學習路線&#xff1a;* 1.python基礎 計算機組成原理、python開發環境、python變量、流程控制語句、文件操作、異常處理、模塊與包、飛機大戰游戲制作等 2.python高級應用 網絡編程、并發編程、數據庫編程、正則表達式、Linux系統應用、函數的高級應用、python的語法進階…

wds+mdt 分布式自動部署 操作系統

一、 安裝準備 1、工具的準備 首先介紹本次項目所涉及到的內容&#xff1a; MDT Microsoft Deployment Toolkit 2012&#xff08;簡稱MDT 2012&#xff09;是微軟最新一代部署工具&#xff0c;通過它可以自動完成桌面和服務器部署的推薦操作進程和工具&#xff0c;MDT主要…

iOS開發網絡篇—數據緩存

iOS開發網絡篇—數據緩存 一、關于同一個URL的多次請求 有時候&#xff0c;對同一個URL請求多次&#xff0c;返回的數據可能都是一樣的&#xff0c;比如服務器上的某張圖片&#xff0c;無論下載多少次&#xff0c;返回的數據都是一樣的。 上面的情況會造成以下問題 &#xff08…

[WinError 10061] 由于目標計算機積極拒絕,無法連接錯誤解決辦法

爬蟲的時候會經常出現"[WinError 10061] 由于目標計算機積極拒絕&#xff0c;無法連接"錯誤這種情況&#xff0c;有可能是LAN口設置不正確 我是在爬取全國天氣情況的時候出現的這種錯誤&#xff0c;后面調了以后可以了1.控制面板——網絡和 Internet—— Internet選項…

Chrome瀏覽器設置小窗口視頻

快捷工具先安裝1.28版本后用1.31版本替換&#xff0c;以實現視頻彈窗和雙擊關閉標簽頁功能。 首先下載Chrome擴展快捷工具1.28版的CRX安裝包&#xff1a;http://pan.baidu.com/s/1pJ4T4td&#xff1b; 然后拖放到chrome擴展管理頁面中安裝。 接著&#xff0c;下載打包好的快捷…

這門課有什么用?

每個老師都苦惱于學生常問的問題&#xff1a;“某某課學了有什么用&#xff1f;”老師費勁巴拉解釋一通&#xff0c;結果還是&#xff1a;然并卵。 一門課有什么用&#xff0c;很難解釋得令人信服&#xff0c;因為這和人的認知水平有關。認知水平達不到&#xff0c;解釋的多深入…

NO.1_python_scrapy組成爬取多頁數據連接數據庫配置文件書寫

scrapy框架組成及各部分作用 item pipelines: 用于存放需要存儲數據的數據模型&#xff0c;一般格式為&#xff1a; #需要存儲多少中類型的數據就寫多少行&#xff0c;一般是key_value組合 數據名稱&#xff0c;即key scrapy.Field()spiders 用于解析返回來的response im…

“智云大咖秀”:大咖攝影師談驚艷亮相的“大咖級”設備

古人云&#xff0c;善書者不擇筆。 古人又云&#xff0c;工欲善其事必先利其器。 古人很矛盾。 這兩句話如果用在影像創作這個領域&#xff0c;可以說都有道理&#xff1a;沒有好的設備&#xff0c;創意大師一樣能夠拍出足夠驚艷的作品&#xff1b;有足夠強的設備&#xff0c;但…

英語 用on還是/at/還是in

in prep. 1. [表示地點、場所、位置等]在…里面&#xff1b;在…內部&#xff1b;在…上&#xff1a;例句: in the room 在房間里 2. [表示時間]在…期間&#xff1b;在(一段時間)以內&#xff1b;過…之久&#xff1a;例句: in summer 在夏天in 3. [表示狀態]在…狀態中&…

js編寫簡易返回頂部按鈕

之前ui設計讓我做個返回頂部的按鈕,我一定頭緒都沒,感覺真要加上這個功能,自己編寫就得一個下午,工作量大為由,所以就推脫了; 當靜下心,有時間搗鼓之后才發現原來so easy!!! 以下是我的js代碼,不足之處還請博友們批評指正; //原生js操作代碼  function scrolls(){   v…

NO.2_python_scrapy_反爬蟲(隨機請求頭IP代理)取消鏈接去重

1.隨機請求頭 # -*- coding: utf-8 -*- """ 所有請求頭的USER_AGENTS網址 http://www.useragentstring.com/pages/useragentstring.php?nameAll """ import json import random import requestsUSER_AGENTS [Mozilla/5.0 (Windows NT 10.0; W…

Cobub無碼埋點關鍵技術的實現

隨著大數據時代的到來&#xff0c;數據采集也已經變的越來越重要。前端埋點作為一個比較成熟的數據接入手段被廣泛應用著。目前埋點分為兩種方式&#xff0c;有碼與無碼埋點。有碼埋點比較容易理解&#xff0c;即調用SDK的API&#xff0c;在代碼中插入埋點的相關代碼&#xff0…

Dedesql數據庫類詳解(二次開發必備教程)(轉)

http://www.dedecms.com/help/development/2009/1028/1076.html 織夢DedeCMS的二次開發不僅僅是會寫寫織夢的標簽&#xff0c;會制作織夢的模板。很多時候&#xff0c;我們需要對織夢DedeCMS的數據庫進行查詢、插入、刪除等等之類的操作&#xff0c;進行這一類的操作之前&#…

裝系統換固態硬盤方法

1、將買回的固態硬盤直接換上電腦的原先機械硬盤 2、或者將自己的光驅拆卸&#xff0c;將固態硬盤裝上去 3、電腦進入boss 界面&#xff0c;找到boot(引導)欄&#xff0c;找到自己的u盤&#xff0c;進入后先分區&#xff0c;然后再重啟&#xff0c; 然后再進入BOSS進入U盤里&…

學習筆記(02):Python網絡編程并發編程-assert斷言的用途

立即學習:https://edu.csdn.net/course/play/24458/296228?utm_sourceblogtoedu 異常處理 1.異常的捕捉 try:正常需要運行的代碼except 可能出現的錯誤 as e:出現這種錯誤需要運行的代碼...except Exception as e:捕捉未知的錯誤&#xff0c;并且將需要運行的代碼放于此處el…