BUAA XCPC 2025 Spring Training 2

C \color{green}{\texttt{C}} C

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem?Discription]

給定一棵以 1 1 1 為根的樹,記 a i a_{i} ai? 表示節點 i i i 的權值, lca( i , j ) \text{lca(}i,j) lca(i,j) 表示節點 i i i j j j 的最近公共祖先,求下面矩陣的行列式,對 998244353 998244353 998244353 取模。

A = ( a lca(1,1) a lca(1,2) … a lca(1,n) a lca(2,1) a lca(2,2) … a lca(2,n) … … a lca(n,1) … … a lca(n,n) ) A = \left ( \begin{matrix} a_{\text{lca(1,1)}} & a_{\text{lca(1,2)}} & \dots & a_{\text{lca(1,n)}} \\ a_{\text{lca(2,1)}} & a_{\text{lca(2,2)}} & \dots & a_{\text{lca(2,n)}} \\ & \dots & \dots & \\ a_{\text{lca(n,1)}} & \dots & \dots & a_{\text{lca(n,n)}}\end{matrix} \right ) A= ?alca(1,1)?alca(2,1)?alca(n,1)??alca(1,2)?alca(2,2)???alca(1,n)?alca(2,n)?alca(n,n)?? ?

[Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis]

線代題。

隨便取出一個葉子節點 u u u,其實有 lca(v,u) = lca(v,fa(u)) \text{lca(v,u)}=\text{lca(v,fa(u))} lca(v,u)=lca(v,fa(u)),其中 v =? u , fa(u) v \not = u, \text{fa(u)} v=u,fa(u) 表示 u u u 的父親。

不妨設 u = n u=n u=n

det A = ∣ a lca(1,1) a lca(1,2) … a lca(1,n) a lca(2,1) a lca(2,2) … a lca(2,n) … … a lca(n,1) … … a lca(n,n) ∣ = ∣ a lca(1,1) a lca(1,2) … a lca(1,n) ? a lca(1,fa(n)) a lca(2,1) a lca(2,2) … a lca(2,n) ? a lca(2,fa(n)) … … a lca(n,1) … … a lca(n,n) ? a lca(n,fa(n)) ∣ = ∣ a lca(1,1) a lca(1,2) … 0 a lca(2,1) a lca(2,2) … 0 … … a lca(n,1) … … a n ? a fa(n) ∣ \text{det} A= \left | \begin{matrix} a_{\text{lca(1,1)}} & a_{\text{lca(1,2)}} & \dots & a_{\text{lca(1,n)}} \\ a_{\text{lca(2,1)}} & a_{\text{lca(2,2)}} & \dots & a_{\text{lca(2,n)}} \\ & \dots & \dots & \\ a_{\text{lca(n,1)}} & \dots & \dots & a_{\text{lca(n,n)}}\end{matrix} \right | = \left | \begin{matrix} a_{\text{lca(1,1)}} & a_{\text{lca(1,2)}} & \dots & a_{\text{lca(1,n)}}-a_{\text{lca(1,fa(n))}} \\ a_{\text{lca(2,1)}} & a_{\text{lca(2,2)}} & \dots & a_{\text{lca(2,n)}}-a_{\text{lca(2,fa(n))}} \\ & \dots & \dots & \\ a_{\text{lca(n,1)}} & \dots & \dots & a_{\text{lca(n,n)}}-a_{\text{lca(n,fa(n))}}\end{matrix} \right | = \left | \begin{matrix} a_{\text{lca(1,1)}} & a_{\text{lca(1,2)}} & \dots & 0 \\ a_{\text{lca(2,1)}} & a_{\text{lca(2,2)}} & \dots & 0 \\ & \dots & \dots & \\ a_{\text{lca(n,1)}} & \dots & \dots & a_{n}-a_{\text{fa(n)}} \end{matrix}\right | detA= ?alca(1,1)?alca(2,1)?alca(n,1)??alca(1,2)?alca(2,2)???alca(1,n)?alca(2,n)?alca(n,n)?? ?= ?alca(1,1)?alca(2,1)?alca(n,1)??alca(1,2)?alca(2,2)???alca(1,n)??alca(1,fa(n))?alca(2,n)??alca(2,fa(n))?alca(n,n)??alca(n,fa(n))?? ?= ?alca(1,1)?alca(2,1)?alca(n,1)??alca(1,2)?alca(2,2)???00an??afa(n)?? ?

由 Laplace 展開,可以轉化為 ( n ? 1 ) (n-1) (n?1) 階的問題進行遞歸。最終答案就是

∏ i = 1 n ( a i ? a fa(i) ) \prod\limits_{i=1}^{n} \left ( a_{i} - a_{\text{fa(i)}} \right ) i=1n?(ai??afa(i)?)


D \color{green}{\texttt{D}} D

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem?Discription]

給定一個 n n n 個點, ( 2 n ? 2 ) (2n-2) (2n?2) 條邊的有向圖,每條邊有邊權。前 ( n ? 1 ) (n-1) (n?1) 條邊構成一棵以 1 1 1 為根的樹,邊的方向遠離根;后 ( n ? 1 ) (n-1) (n?1) 條邊為每個點到 1 1 1 的邊。每次操作修改其中一條邊的邊權,或求出從 u u u v v v 的最短路。

邊權為 [ 1 , 1 × 1 0 6 ] [1,1 \times 10^{6}] [1,1×106] 間的整數。

[Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis]

u u u v v v 的路徑其實很少。

  1. 如果 u u u 能沿著樹上的邊走到 v v v,那肯定沿著樹走最優。
  2. 否則 u u u 必須先回到 1 1 1,再從 1 1 1 沿著樹走到 v v v

維護 1 1 1 沿著樹到每個點的距離(基為 Len ( u ) \text{Len}(u) Len(u)),當修改一條樹上邊的時候,整棵子樹內所有點的距離都將發生變化,但是變化量相同。利用樹的深度優先遍歷序(即 dfs \text{dfs} dfs 序)連續的性質,可以用線段樹維護這個距離。

然后第 1 1 1 種情況的答案其實就是 Len ( v ) ? Len ( u ) \text{Len}(v)-\text{Len}(u) Len(v)?Len(u)

這里其實利用了差分的思想,將區間求和的問題轉化為了前綴和相減。

考慮求出 u u u 回到 1 1 1 的最短路。

從直覺上講,很容易以為就是后 ( n ? 1 ) (n-1) (n?1) 條邊的權值。但是顯然 too young too simple 了。

u u u 雖然不能沿著樹的父親回到 1 1 1,但它可以先到自己的某個子孫再回到 1 1 1。假設 u u u 走到子樹內的節點 w w w 再從 w w w 回到 1 1 1,那么路徑的長度就是:

l u , w + val w l_{u,w}+\text{val}_w lu,w?+valw?

其中 l u , w l_{u,w} lu,w? 表示在樹上從 u u u w w w 的距離, val w \text{val}_{w} valw? 表示 w w w 1 1 1 的邊的長度。

顯然這樣是求不出來的。但是 l u , w = Len w ? Len u l_{u,w}=\text{Len}_{w}-\text{Len}_{u} lu,w?=Lenw??Lenu?,于是上面式子改寫成:

( Len w + val w ) ? Len u \left ( \text{Len}_{w} + \text{val}_{w} \right )-\text{Len}_{u} (Lenw?+valw?)?Lenu?

括號內的項僅和 w w w 有關,括號外僅和 u u u 有關。可以用線段樹維護括號內的項,這樣就可以單次 O ( log ? n ) O(\log n) O(logn) 地求出所需結果。

這也是一個經典的 trick。如果一個式子里含有兩個變量,那一般的數據結構都是無法維護的。分離變量是一個很好的方法。

具體實現看代碼。

考場上那些傻瓜錯誤:

  1. 有向圖看成無向圖(但其實主體思路沒有太大變化!)。
  2. 沒有考慮到 u u u 可以先走到子樹再回根。
  3. 數組開太小了……

[Code] \color{blue}{\text{[Code]}} [Code]

int Fa[22][N],n,dep[N],q;
int u[N<<1],v[N<<1],w[N<<1],len[N];
int End[N],rec[N],dfscnt,Trans[N];
ll Len[N];
//len[i] 表示從 i 到 1 的直接邊的長度 
//Len[i] 表示初始時 1 沿著樹到 i 的總長度 struct Segment_Tree{int ls[N<<1],rs[N<<1],rt,ndcnt;ll sum[N<<1],tag[N<<1],minn[N<<1];void pushup(int o){sum[o]=sum[ls[o]]+sum[rs[o]];minn[o]=min(minn[ls[o]],minn[rs[o]]);}void pushdown(int o,int l,int r){tag[ls[o]]+=tag[o];tag[rs[o]]+=tag[o];minn[ls[o]]+=tag[o];minn[rs[o]]+=tag[o];int mid=(l+r)>>1;sum[ls[o]]+=tag[o]*(mid-l+1);sum[rs[o]]+=tag[o]*(r-mid);tag[o]=0;}void build(int &o,int l,int r,int tpe){o=++ndcnt;tag[o]=sum[o]=minn[o]=0;if (l==r){if (tpe==1) sum[o]=minn[o]=Len[Trans[l]];else sum[o]=minn[o]=Len[Trans[l]]+len[Trans[r]];return;}int mid=(l+r)>>1;build(ls[o],l,mid,tpe);build(rs[o],mid+1,r,tpe);return pushup(o);}void modify(int o,int l,int r,int p,int q,int v){if (p<=l&&r<=q){tag[o]+=v;minn[o]+=v;sum[o]+=1ll*v*(r-l+1);return;}if (tag[o]) pushdown(o,l,r);int mid=(l+r)>>1;if (p<=mid) modify(ls[o],l,mid,p,q,v);if (mid<q) modify(rs[o],mid+1,r,p,q,v);return pushup(o);}ll query(int o,int l,int r,int p){if (l==r) return sum[o];if (tag[o]) pushdown(o,l,r);int mid=(l+r)>>1;if (p<=mid) return query(ls[o],l,mid,p);else return query(rs[o],mid+1,r,p);}ll query(int o,int l,int r,int p,int q){if (p<=l&&r<=q) return minn[o];if (tag[o]) pushdown(o,l,r);int mid=(l+r)>>1;ll ans=1e18;if (p<=mid) ans=min(ans,query(ls[o],l,mid,p,q));if (mid<q) ans=min(ans,query(rs[o],mid+1,r,p,q));return ans;}
}SGT,sgt;struct edge{int nxt,to,len;
}e[N<<1];int h[N],ecnt;
void add(int u,int v,int w){e[++ecnt]=(edge){h[u],v,w};h[u]=ecnt;
}void dfs(int u,int fa){rec[u]=++dfscnt;Trans[dfscnt]=u;dep[u]=dep[fa]+1;Fa[0][u]=fa;for(int i=1;i<=20;i++)Fa[i][u]=Fa[i-1][Fa[i-1][u]];for(int i=h[u];i;i=e[i].nxt){int v=e[i].to;if (v==fa) continue;Len[v]=Len[u]+e[i].len;dfs(v,u);}End[u]=dfscnt;//記錄 dfs 序 
}
int LCA(int u,int v){if (dep[u]<dep[v]) swap(u,v);for(int i=20;i>=0;i--)if (dep[Fa[i][u]]>=dep[v])u=Fa[i][u];if (u==v) return u;for(int i=20;i>=0;i--)if (Fa[i][u]!=Fa[i][v]){u=Fa[i][u];v=Fa[i][v];}return Fa[0][v];
}ll query(int u){return sgt.query(sgt.rt,1,n,rec[u],End[u])-SGT.query(SGT.rt,1,n,rec[u]);
}
ll query(int u,int v){ll res;if (u==v) return 0;if (LCA(u,v)==u) res=SGT.query(SGT.rt,1,n,rec[v])-SGT.query(SGT.rt,1,n,rec[u]);else res=query(u)+SGT.query(SGT.rt,1,n,rec[v]);return res;
}int main(int argv,char *argc[]){n=read();q=read();for(int i=1;i<n;i++){u[i]=read();v[i]=read();w[i]=read();add(u[i],v[i],w[i]);add(v[i],u[i],w[i]);}for(int j=1;j<n;j++){int i=j+(n-1);//真實邊標號 u[i]=read();v[i]=read();//v[i] == 1w[i]=read();len[u[i]]=w[i];}dfs(1,0);SGT.build(SGT.rt,1,n,1);sgt.build(sgt.rt,1,n,2);for(int i=1;i<=q;i++){int opt=read(),s=read(),t=read();if (opt==1){if (s<n){//修改樹上的邊 SGT.modify(SGT.rt,1,n,rec[v[s]],End[v[s]],t-w[s]);sgt.modify(sgt.rt,1,n,rec[v[s]],End[v[s]],t-w[s]);//v[s] 的子樹內所有點到 1 的距離發生變化 w[s]=t;}else{sgt.modify(sgt.rt,1,n,rec[u[s]],rec[u[s]],t-len[u[s]]);len[u[s]]=t;}}else printf("%lld\n",query(s,t));}return 0;
}

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

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

相關文章

MySQL 中,分庫分表機制和分表分庫策略

在 MySQL 中,分庫分表是一種常見的數據庫水平擴展方案,用于解決單庫單表數據量過大導致的性能瓶頸問題。通過將數據分散到多個數據庫或表中,可以提高系統的并發處理能力、降低單點故障風險,并提升查詢性能。 一、分庫分表的作用 提升性能: 分散數據存儲和查詢壓力,避免單…

組件日志——etcd

目錄 一、簡介 二、安裝【Ubuntu】 安裝etcd 安裝CAPI 三、寫一個示例 3.0寫一個示例代碼 3.1獲取一個etcd服務 3.2獲取租約(寫端操作) 3.3使用租約(寫端操作) 3.4銷毀租約(寫端操作) 3.5獲取etcd服務中的服務列表(讀端操作) 3.6監聽狀態變化(讀端操作) 一、簡介 Et…

python網絡爬蟲開發實戰之網頁數據的解析提取

目錄 1 XPath的使用 1.1 XPath概覽 1.2 XPath常用規則 1.3 準備工作 1.4 實例引入 1.5 所有節點 1.6 節點 1.7 父節點 1.8 屬性匹配 1.9 文本獲取 1.10 屬性獲取 1.11 屬性多值匹配 1.12 多屬性匹配 1.13 按序選擇 1.14 節點軸選擇 2 Beautiful Soup 2.1 簡介…

理解操作系統(一)馮諾依曼結構和什么是操作系統

認識馮諾依曼系統 操作系統概念與定位 深?理解進程概念&#xff0c;了解PCB 學習進程狀態&#xff0c;學會創建進程&#xff0c;掌握僵?進程和孤?進程&#xff0c;及其形成原因和危害 1. 馮諾依曼體系結構 我們常?的計算機&#xff0c;如筆記本。我們不常?的計算機&am…

Tomcat常見漏洞攻略

一、CVE-2017-12615 漏洞原理&#xff1a;當在Tomcat的conf&#xff08;配置?錄下&#xff09;/web.xml配置?件中添加readonly設置為false時&#xff0c;將導致該漏洞產 生&#xff0c;&#xff08;需要允許put請求&#xff09; , 攻擊者可以利?PUT方法通過精心構造的數據包…

快速求出質數

要快速判斷一個數是否為質數&#xff0c;可以采用以下優化后的試除法&#xff0c;結合數學規律大幅減少計算量&#xff1a; 步驟說明 處理特殊情況&#xff1a; 若 ( n \leq 1 )&#xff0c;不是質數。若 ( n 2 ) 或 ( n 3 )&#xff0c;是質數。若 ( n ) 能被 2 或 3 整除&…

Linux上位機開發實戰(camera視頻讀取)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 關于linux camera&#xff0c;一般都是認為是mipi camera&#xff0c;或者是usb camera。當然不管是哪一種&#xff0c;底層的邏輯都是v4l2&#x…

高性能緩存:使用 Redis 和本地內存緩存實戰示例

在現代高并發系統中&#xff0c;緩存技術是提升性能和降低數據庫壓力的關鍵手段。無論是分布式系統中的Redis緩存&#xff0c;還是本地高效的本地內存緩存&#xff0c;合理使用都能讓你的應用如虎添翼。今天&#xff0c;我們將基于go-dev-frame/sponge/pkg/cache庫的代碼示例&a…

Python實現deepseek接口的調用

簡介&#xff1a;DeepSeek 是一個強大的大語言模型&#xff0c;提供 API 接口供開發者調用。在 Python 中&#xff0c;可以使用 requests 或 httpx 庫向 DeepSeek API 發送請求&#xff0c;實現文本生成、代碼補全&#xff0c;知識問答等功能。本文將介紹如何在 Python 中調用 …

山東大學數據結構課程設計

題目&#xff1a;全國交通咨詢模擬系統 問題描述 處于不同目的的旅客對交通工具有不同的要求。例如&#xff0c;因公出差的旅客希望在旅途中的時間盡可能地短&#xff0c;出門旅游的旅客則期望旅費盡可能省&#xff0c;而老年旅客則要求中轉次數最少。編織一個全國城市間的交…

深入理解倒排索引原理:從 BitSet 到實際應用

倒排索引是一種極為重要的數據結構&#xff0c;它能夠高效地支持大規模數據的快速查詢&#xff0c;本文將深入探討倒排索引的原理&#xff0c;借助 BitSet 這種數據結構來理解其實現機制&#xff0c;并通過具體的JSF請求條件示例來展示其在實際應用中的運算過程。 BitSet&#…

Unity網絡開發快速回顧

知識點來源&#xff1a;總結人間自有韜哥在&#xff0c; 唐老獅&#xff0c;豆包 目錄 1.網絡通信-通信必備知識-IP地址和端口類2.網絡通信中序列化和反序列化2進制數據3.Socket類4.TCP同步服務端和客戶端基礎實現4.1.服務端基本實現4.2.客戶端實現&#xff1a; 5.區分消息類型…

內網滲透技術 Docker逃逸技術(提權)研究 CSMSF

目錄 如何通過上傳的webshell判斷當前環境是否是物理環境還是Docker環境 方法一&#xff1a;檢查文件系統 方法二&#xff1a;查看進程 方法三&#xff1a;檢查網絡配置 方法四&#xff1a;檢查環境變量 方法五&#xff1a;檢查掛載點 總結 2. 如果是Docker環境&#x…

動態規劃:從暴力遞歸到多維優化的算法進化論(C++實現)

動態規劃&#xff1a;從暴力遞歸到多維優化的算法進化論 一、動態規劃的本質突破 動態規劃&#xff08;Dynamic Programming&#xff09;不是簡單的遞歸優化&#xff0c;而是計算思維范式的革命性轉變。其核心價值在于通過狀態定義和決策過程形式化&#xff0c;將指數復雜度問…

數據結構與算法-數據結構-樹狀數組

概念 樹狀數組&#xff0c;也叫二叉索引樹&#xff08;Binary Indexed Tree&#xff0c;BIT&#xff09;&#xff0c;它是用數組來模擬樹形結構。樹狀數組的每個節點存儲的是數組中某一段的和&#xff08;或其他可合并的信息&#xff09;&#xff0c;通過巧妙的索引方式和樹形…

AI比人腦更強,因為被植入思維模型【19】三腦理論思維模型

定義 三腦理論思維模型是由美國神經科學家保羅麥克萊恩&#xff08;Paul MacLean&#xff09;提出的&#xff0c;該理論認為人類的大腦由三個不同但又相互關聯的部分組成&#xff0c;分別是爬蟲腦&#xff08;Reptilian Brain&#xff09;、邊緣腦&#xff08;Limbic Brain&am…

使用 patch-package 優雅地修改第三方依賴庫

在前端開發中&#xff0c;有時我們需要對第三方依賴庫進行修改以滿足項目需求。然而&#xff0c;直接修改 node_modules 中的文件并不是一個好方法&#xff0c;因為每次重新安裝依賴時這些修改都會丟失。patch-package 是一個優秀的工具&#xff0c;可以幫助我們優雅地管理這些…

馬科維茨均值—方差理論推導過程

下面給出一個詳細的、符號嚴謹、公式連貫的馬科維茨均值—方差理論推導過程&#xff0c;假設你輸入了 nnn 列股票的歷史收盤價數據。我們從數據符號的定義開始&#xff0c;逐步構建所有公式&#xff0c;并詳細解釋每個符號的意義。

僅靠prompt,Agent難以自救

Alexander的觀點很明確&#xff1a;未來 AI 智能體的發展方向還得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。還拿目前很火的 Manus 作為案例&#xff1a;他認為像 Manus 這樣基于「預先編排好的提示詞與工具路徑」構成的工作流智能體&#xff0c;…

【css酷炫效果】純CSS實現懸浮彈性按鈕

【css酷炫效果】純CSS實現懸浮彈性按鈕 緣創作背景html結構css樣式完整代碼效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;https://download.csdn.net/download/u011561335/90492020 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&…