P3258 [JLOI2014] 松鼠的新家

題目描述

松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有 n n n 個房間,并且有 n ? 1 n-1 n?1 根樹枝連接,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在“樹”上。

松鼠想邀請小熊維尼前來參觀,并且還指定一份參觀指南,他希望維尼能夠按照他的指南順序,先去 a 1 a_1 a1?,再去 a 2 a_2 a2?,……,最后到 a n a_n an?,去參觀新家。可是這樣會導致重復走很多房間,懶惰的維尼不停地推辭。可是松鼠告訴他,每走到一個房間,他就可以從房間拿一塊糖果吃。

維尼是個饞家伙,立馬就答應了。現在松鼠希望知道為了保證維尼有糖果吃,他需要在每一個房間各放至少多少個糖果。

因為松鼠參觀指南上的最后一個房間 a n a_n an? 是餐廳,餐廳里他準備了豐盛的大餐,所以當維尼在參觀的最后到達餐廳時就不需要再拿糖果吃了。

輸入格式

第一行一個正整數 n n n,表示房間個數第二行 n n n 個正整數,依次描述 a 1 , a 2 , ? , a n a_1, a_2,\cdots,a_n a1?,a2?,?,an?

接下來 n ? 1 n-1 n?1 行,每行兩個正整數 x , y x,y x,y,表示標號 x x x y y y 的兩個房間之間有樹枝相連。

輸出格式

一共 n n n 行,第 i i i 行輸出標號為 i i i 的房間至少需要放多少個糖果,才能讓維尼有糖果吃。

輸入輸出樣例 #1

輸入 #1

5
1 4 5 3 2
1 2
2 4
2 3
4 5

輸出 #1

1
2
1
2
1

說明/提示

對于全部的數據,$2 \le n \le 3 \time算法思路

樹結構構建:

使用鄰接表存儲樹結構(add函數)。
節點數 n n n,訪問序列存儲在vis數組。
預處理階段:

DFS遍歷(dfs1函數):從根節點(設為1)出發,計算每個節點的深度 d e de de和直接父節點 f a [ i ] [ 0 ] fa[i][0] fa[i][0]

倍增預處理:計算每個節點的 2 j 2^j 2j級祖先,用于LCA查詢: f a [ i ] [ j ] = f a [ f a [ i ] [ j ? 1 ] ] [ j ? 1 ] ( 1 ≤ j ≤ 20 ) fa[i][j] = fa[fa[i][j-1]][j-1] \quad (1 \leq j \leq 20) fa[i][j]=fa[fa[i][j?1]][j?1](1j20)

對數預處理:lg數組滿足 2 lg [ k ] ? 1 ≤ k < 2 lg [ k ] 2^{\text{lg}[k]-1} \leq k < 2^{\text{lg}[k]} 2lg[k]?1k<2lg[k],用于LCA跳躍優化。

LCA計算(lca函數):

調整節點深度:若 d e [ a ] < d e [ b ] de[a] < de[b] de[a]<de[b],交換 a , b a,b a,b
將較深節點上跳到與較淺節點同一深度:
a = f a [ a ] [ lg [ d e [ a ] ? d e [ b ] ] ? 1 ] a = fa[a][\text{lg}[de[a]-de[b]]-1] a=fa[a][lg[de[a]?de[b]]?1]
若此時 a = b a=b a=b,返回 a a a;否則同步上跳至LCA的子節點: a = f a [ a ] [ j ] , b = f a [ b ] [ j ] ( j 從大到小枚舉 ) a = fa[a][j], \ b = fa[b][j] \quad (j \text{從大到小枚舉}) a=fa[a][j],?b=fa[b][j](j從大到小枚舉)

最終LCA為 f a [ a ] [ 0 ] fa[a][0] fa[a][0]

路徑標記與調整:

初始化:a[vis[1]] = 1。
遍歷訪問序列( i i i從2到 n n n):
對相鄰節點對 ( v i s [ i ? 1 ] , v i s [ i ] ) (vis[i-1], vis[i]) (vis[i?1],vis[i])
差分標記:b[vis[i-1]]++, b[vis[i]]++。
計算LCA(設為 j s js js):b[js]–, b[fa[js][0]]–。
調整:a[vis[i-1]]–。
序列結束:a[vis[n]]–。
差分數組累加(dfs2函數):

從葉子向根DFS,將子節點的 b b b值累加到父節點: b [ k ] = b [ k ] + ∑ 子節點 t b [ t ] b[k] = b[k] + \sum_{\text{子節點}t} b[t] b[k]=b[k]+子節點t?b[t]

最終答案:

對每個節點 i i i,輸出 a [ i ] + b [ i ] a[i] + b[i] a[i]+b[i]
復雜度分析
時間:
DFS遍歷: O ( n ) O(n) O(n)
倍增預處理: O ( n log ? n ) O(n \log n) O(nlogn)
n ? 1 n-1 n?1次LCA查詢: O ( n log ? n ) O(n \log n) O(nlogn)
差分累加: O ( n ) O(n) O(n)
總時間復雜度: O ( n log ? n ) O(n \log n) O(nlogn)
空間: O ( n log ? n ) O(n \log n) O(nlogn)(存儲祖先數組)s 10^5$, 1 ≤ a i ≤ n 1 \le a_i \le n 1ai?n

詳細代碼

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int h[N],fa[N][25];
int vis[N],lg[N],de[N];
int a[N],b[N];
int m,n,i,j,x,y,tot;
struct node{int w,to,ne;
}wc[N*2];
void add(int a,int b)
{tot++;wc[tot].w=a;wc[tot].to=b;wc[tot].ne=h[a];h[a]=tot;
}
void dfs1(int k)
{int s=h[k];while(s!=0){int t=wc[s].to;if(t!=fa[k][0]){fa[t][0]=k;de[t]=de[k]+1;dfs1(t);} s=wc[s].ne;}
}
int lca(int a,int b)
{if(de[a]<de[b]){int t=a;a=b;b=t;}while(de[a]!=de[b]){int k=lg[de[a]-de[b]]-1;a=fa[a][k];}if(a==b) return a;else{for(j=lg[de[a]]-1;j>=0;j--){if(fa[a][j]!=fa[b][j]){a=fa[a][j];b=fa[b][j];}}}return fa[a][0];
}
void dfs2(int k)
{int s=h[k];while(s!=0){int t=wc[s].to;if(t!=fa[k][0]){dfs2(t);b[k]+=b[t];}s=wc[s].ne;}
}
int main()
{ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(i=1;i<=n;i++)cin>>vis[i]; for(i=1;i<=n-1;i++){cin>>x>>y;add(x,y);add(y,x);}dfs1(1);for(j=1;j<=20;j++)for(i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];for(i=1;i<=n;i++)lg[i]=lg[i-1]+(1<<lg[i-1]==i?1:0);a[vis[1]]++;for(i=2;i<=n;i++){int js=lca(vis[i],vis[i-1]);b[vis[i]]++;b[vis[i-1]]++;b[js]--;b[fa[js][0]]--;a[vis[i-1]]--;}a[vis[n]]--;dfs2(1);for(i=1;i<=n;i++)cout<<a[i]+b[i]<<endl;return 0;
}

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

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

相關文章

基于openfeign攔截器RequestInterceptor實現的微服務之間的夾帶轉發

需求&#xff1a; trade服務需要在下單后清空購物車 分析&#xff1a; 顯然&#xff0c;清空購物車需要調用cart服務&#xff0c;也就是這個功能的實現涉及到了微服務之間的轉發。 其次&#xff0c;清空購車還需要userId&#xff0c;所以需要使用RequestInterceptor來實現夾…

w~深度學習~合集9

我自己的原文哦~ https://blog.51cto.com/whaosoft/14010384 #UPSCALE 這里設計了一個通用算法UPSCALE&#xff0c;可以剪枝具有任意剪枝模式的模型。通過消除約束&#xff0c;UPSCALE將ImageNet精度提高2.1個點。 paper地址&#xff1a;https://arxiv.org/pdf/2307.08…

python如何刪除xml中的w:ascii屬性

可以使用Python的xml.etree.ElementTree模塊通過以下步驟刪除XML中的w:ascii屬性&#xff1a; import xml.etree.ElementTree as ET# 原始XML片段&#xff08;需包含命名空間聲明&#xff09; xml_str <w:rPr xmlns:w"http://schemas.openxmlformats.org/wordproces…

【React】React CSS 樣式設置全攻略

在 React 中設置 CSS 樣式主要有以下幾種方式&#xff0c;各有適用場景&#xff1a; 1. 內聯樣式 (Inline Styles) 直接在 JSX 元素中使用 style 屬性&#xff0c;值為 JavaScript 對象&#xff08;使用駝峰命名法&#xff09; function Component() {return (<div style…

JS紅寶書筆記 8.2 創建對象

雖然使用Object構造函數或對象字面量可以方便地創建對象&#xff0c;但這些方式有明顯不足&#xff1a;創建具有同樣接口的多個對象需要重復編寫很多代碼 工廠模式可以用不同的參數多次調用函數&#xff0c;每次都會返回一個新對象&#xff0c;這種模式雖然可以解決創建多個類…

高通camx hal進程dump日志分析三:Pipeline DumpDebugInfo原理分析

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 目錄 一、問題背景 二、DumpDebugInfo原理 2.1:我們分析下代碼 2.2 :Pipeline Dump debug info 2.3 :dump Metadata Pending Node信息 2.4 :Dump Metadata Pool Debug信息 2.5 :No…

【數據結構】_二叉樹基礎OJ

目錄 1. 單值二叉樹 1.1 題目鏈接與描述 1.2 解題思路 1.3 程序 2. 相同的樹 2.1 題目鏈接與描述 2.2 解題思路 2.3 程序 3. 對稱二叉樹 3.1 題目鏈接與描述 3.2 解題思路 3.3 程序 1. 單值二叉樹 1.1 題目鏈接與描述 題目鏈接&#xff1a; 965. 單值二叉樹 - 力…

軟件工程畫圖題

目錄 1.大綱 2.數據流圖 3.程序流圖 4.流圖 5.ER圖 6.層次圖 7.結構圖 8.盒圖 9.狀態轉換圖 10.類圖 11.用例圖 12.活動圖 13.判定表和判定樹 14.基本路徑測試過程(白盒測試) 15.等價類劃分(黑盒測試) 1.大綱 (1).數據流圖 (2).程序流圖 (3).流圖 (4).ER圖…

H7-TOOL自制Flash讀寫保護算法系列,為華大電子CIU32F003制作使能和解除算法,支持在線燒錄和脫機燒錄使用2025-06-20

說明&#xff1a; 很多IC廠家僅發布了內部Flash算法文件&#xff0c;并沒有提供讀寫保護算法文件&#xff0c;也就是選項字節算法文件&#xff0c;需要我們制作。 實際上當前已經發布的TOOL版本&#xff0c;已經自制很多了&#xff0c;比如已經支持的兆易創新大部分型號&…

go channel用法

介紹 channel 在 Go 中是一種專門用來在 goroutine 之間傳遞數據的類型安全的管道。 你可以把它理解成&#xff1a; 多個 goroutine 之間的**“傳話筒”**&#xff0c;誰往通道里塞東西&#xff0c;另一個 goroutine 就能接收到。 Go 語言采用 CSP&#xff08;Communicatin…

openLayers切換基于高德、天地圖切換矢量、影像、地形圖層

1、需要先加載好地圖&#xff0c;具體點此鏈接 openLayers添加天地圖WMTS、XYZ瓦片服務圖層、高德地圖XYZ瓦片服務圖層-CSDN博客文章瀏覽閱讀31次。本文介紹了基于OpenLayers的地圖交互功能實現&#xff0c;主要包括以下內容&#xff1a; 地圖初始化&#xff1a;支持天地圖XYZ…

springMVC-15 異常處理

異常處理-基本介紹 基本介紹 1.Spring MVC通過HandlerExceptionResolver處理程序的異常&#xff0c;包括Handler映射、數據綁定以及目標方法執行時發生的異常。 2.主要處理Handler中用ExceptionHandler注解定義的方法。 3.ExceptionHandlerMethodResolver內部若找不到Excepti…

視頻匯聚EasyCVR平臺v3.7.2發布:新增全局搜索、播放器默認解碼方式等4大功能

EasyCVR視頻匯聚平臺帶著全新的v3.7.2版本重磅登場&#xff01;此次升級&#xff0c;絕非簡單的功能堆砌&#xff0c;而是從用戶體驗、操作效率以及系統性能等多維度進行的深度優化與革新&#xff0c;旨在為大家帶來更加強大、穩定且高效的視頻監控管理體驗。 一、全局功能搜索…

三、kubectl使用詳解

三、kubectl使用詳解 文章目錄 三、kubectl使用詳解1、常用基礎命令1.1 Kubectl命令格式1.2 查詢一個資源1.3 創建一個資源1.4 修改一個資源1.5 刪除一個資源1.6 其他 2、K8s隔離機制Namespace&#xff08;命名空間作用及使用&#xff09;2.1 什么是命名空間2.2 命名空間主要作…

JVM內存模型詳解

JVM內存模型詳解 Java虛擬機(JVM)內存模型是理解Java程序運行機制的核心&#xff0c;它定義了程序運行時數據的組織方式和訪問規則。與Java內存模型(JMM)關注并發不同&#xff0c;JVM內存模型主要描述運行時數據區的結構和功能。 一、JVM內存模型概述 JVM內存模型將運行時數…

《對話式 AI 白皮書》共創者招募

在 AI Agent 技術不斷演變的當下&#xff0c;共創一本不斷演變的對話式 AI 白皮書&#xff0c;共同探索人機對話的新紀元。無論你是開發者、技術專家、生態伙伴還是創業者&#xff0c;都期待你的加入。 項目地址&#xff1a;https://github.com/RTE-Dev/book_era_convoai/ 在…

Flux功能介紹,完整使用示例,與Mono對比

以下是關于Reactor框架中Flux與Mono的功能介紹、使用示例及對比分析&#xff1a; Flux功能介紹 核心定義 Flux是Reactor庫中的核心接口&#xff0c;表示一個異步的、包含零到多個元素的序列&#xff08;類似流式數據處理&#xff09;[3][4][7]。它可以處理無限長度的數據流&am…

Git使用基本指南

一、Git 基礎配置 首先需要配置用戶信息&#xff0c;讓 Git 知道你是誰&#xff1a; git config --global user.name "你的名字" git config --global user.email "你的郵箱example.com" 如果需要查看配置信息&#xff0c;可以使用&#xff1a; git co…

【入門】【例17.3】 內功逼毒

| 時間限制&#xff1a;C/C 1000MS&#xff0c;其他語言 2000MS 內存限制&#xff1a;C/C 64MB&#xff0c;其他語言 128MB 難度&#xff1a;中等 分數&#xff1a;100 OI排行榜得分&#xff1a;12(0.1分數2難度) 出題人&#xff1a;root | 描述 黃蓉中了毒&#xff0c;在 t 時…

蘋果芯片macOS安裝版Homebrew(親測)

在Linux服務器上安裝一個軟件常用yum&#xff0c;apt、dnf命令&#xff0c;同樣macOS可以使用brew命令來安裝軟件。 brew會自動幫你下載、解壓、安裝和配置&#xff0c;更重要的是&#xff1a;它還會自動處理好軟件之間的依賴關系&#xff0c;它將所有軟件都安裝在獨立的統一目…