旧题新做:从idy的视角看数据结构
“今天你不寫總結……!!!”
額……
還是講我的吧。這些考試都是idy出的題。
20170121:DFS序、 ST表、線段樹練習
這是第一次考數據結構。
Problem 1. setsum?1 second
給你一個長度為N 的整數序列,支持兩種操作:
? modity l r val 將區間[l,r] 中的所有數修改為val
? query l r 詢問區間[l,r] 所有數的和
分析:最簡單的線段樹,區間更改區間求和。但注意是更改,不是添改,sum與flag需同時覆蓋。
Problem 2. subtree?1 second
給出一棵N 個點的有根樹(以1 為根),每個點有點權,要求支持:
? modify u x 把節點u 的點權加x
? query u 詢問u 代表的子樹的點權和
分析:DFS序,單點修改區間求和
Problem 3. matgcd?1 second
給出一個N M 的正整數矩陣,再給出Q 個詢問:
? query x1 y1 x2 y2:詢問(x1,y1)-(x2,y2) 這個子矩形的最大公約數。
分析:idy所說的“正解”,我現在依舊很敬畏。樹套樹,外面按行,行有ls,rs但也有一棵按列的樹。合并時,ls的被套樹與rs的被套樹相合并。查詢時,若行已卡入,則進入其按列樹進行統計。此題無修改,若有修改,則標記需要好好講究。但此題就是無修改,故可用ST表水過去。代碼實現很暴力。
20170122:LCA 值域線段樹 加 復習
基本在樹上。
Problem 1. distance?1 second
小慶住在一個很特別的國度里,它有N 個城市,并且只建了N -1 條雙向路,但神奇的是任意兩個城市都可以通過這些路連接起來。小慶最近在研究寒假的旅游計劃,有時她想快速地知道兩個城市之間的距離,于是找你來幫幫解決。
分析:ST表倍增經典做法,存anc與cost。
Problem 2. redpacket?1 second
承上題)小漫是小慶那個國家的國王,她住在1 號城市,u 號城市如果到1 必定經過v 號城市,我們則稱v 號城市管轄u 號城市(v 號城市也管轄自己)。過年了,小漫想給國家的一些城市發紅包,每次她會給u 號城市管轄的每個城市發放w 的紅包,有時,她也想知道某個城市或被某個城市管轄的城市一共得了多少紅包。如下:
? give u w :表示將u 號城市管轄的每個城市發w 的紅包。
? single u :表示詢問u 號城市得了多少紅包。
? all u :表示詢問u 號城市管轄的城市一共得了多少紅包。
分析:DFS序,簡單處理。
Problem 3. kth?1 second
小敏有個可重集S,一開始就包含一些整數,現在有三種操作需要你執行:
? add x 將整數數x 加到集合中
? del x 如果集合中有整數x,則刪除一個x,否則忽略本操作。
? query k 詢問這個集合中第k 小的整數數是多少
分析:值域線段樹,若不提前給出上下界,須讀入離散化。
20170123:最SXBK的一次練習
額額額額額。
Problem 1. dcplca?1 second
這是一道練習題,要求你們用鏈剖來寫lca,熟悉鏈剖的過程。(以節點1 為根)
分析:神奇的idy為了防止你用倍增,一定會卡O(nlog n)的內存。但是,鏈剖確實不難寫。DFS1:siz,son,fat,dep。DFS2:top,in,out,seq。DFS2中的后三者是為了方便用線段樹DFS序,一條重鏈上in值是連續的。
Problem 2. treekth?1 second
給你棵帶點權樹,一些詢問:
? query u v 詢問節點u 和v 之間的簡單路徑上的點權的中位數1。
分析:這道題才是真正SXBK的那道題。先用樹鏈剖分(后面求LCA),再DFS建出主席樹(存鏈值),然后用差分求出中位數。但是,就是調不出來!!!(筆者現在已經調了出來……)
Problem 3. full?1 second
我們來個完全版如何?
給你棵帶點權的樹(以1 為根),要你完成一些操作。
? msub u x:將u 代表的子樹的點權整體加x
? mpth u v x:將u 到v 的簡單路徑的點權整體加x
??qsub u:詢問子樹u 的點權和
? qpth u v:詢問路徑u 到v 的點權和
分析:鏈剖與DFS序共存。
20170318:數據結構第1套模擬題
是否變難了?
Problem 1. rotinv?2 seconds?256 MB
如果你有一個長度為n 的序列:
a1,a2,a3,……,an
那么它的一個逆序對是一個二元組:< i, j > 滿足i < j 且ai > aj,其中i, j ∈ [1, n]。
我們稱一個序列所包含的逆序對的個數為這個序列的逆序對數。
那么問題來了:
我給出一個長度為n 的序列,需要你計算:
a1,a2,a3,……,an-1,an
a2,a3,a4,……,an,a1
?……
an,a1,a2,……,an-2,an-1
這n 個序列的逆序對之和。
分析:方法很多,但大致相似。轉化為數學公式,然后用樹狀數組快速解決。對于這種問題的極困難版,可見BZOJ 圖騰。
Problem 2. rise?2 seconds?256 MB
你有一堆柱子,它們豎直地并排擺放在桌子上,它們的高度分別是:
h1,h2,h3,……,hn
你從前往后看,能夠看見的柱子個數為這個柱子序列的“可見度”(能夠看見柱子i 當且僅當hj < hi & j < i)。
現在給你一個長度為n 的序列,還有m 個詢問,每次詢問某個區間[l,r] 的柱子單獨拿出來后,其可見度是多大。
分析:當時并沒有看懂題解。后來做了一道BZOJ 樓房重建,再一看便恍然大悟。與那道題相似,但需要多存儲一些東西。因為沒有修改,可以充分使用此題的性質。但丁神在統計的時候,把所有線段先放入了棧,再集中處理。看似更加麻煩,但其實更加樸素,更加靈活。還有,當時很迷,于是寫了個暴力(鏈表)水了過去。
Problem 3. seqmod?2 seconds?256 MB
給你一棵無根樹,邊有邊權,且是[0,9] 之間的整數,給你m 個詢問,每次詢問兩個點u, v 之間的路徑的邊的邊權順次連接起來后構成的那個數字取模于31。
分析:題面十分易懂。鏈剖也很好想,但是,就像其他很多的DS題一樣,你以為自己已經明白了,但還是有太多細節沒有想到。為了方便合并,idy想到用struct來做到方便的合并。找路徑的方式也有不同,誰深了就跳誰,最后到同一條鏈上進行最后的合并。每一個節點也存了2個方向,但怎樣區分?很簡單,按深度。
20170404:practice before 省選
啊啊啊啊啊!
Problem 1. setmod?2 seconds?256 MB
給你一個序列:a1,a2,a3,……, an,有m 個操作,操作如下:
? modify l r x 將區間[l,r] 中的每個數修改為x
? change l r x 將區間[l,r] 中的每個數加上x
? query l r 詢問區間[l,r] 中的和
分析:我在處理時,用了一種叫做kill的標記。因為“修改為”==“清場”+“加上”。但是,這似乎有點不負責任。若+=與=標記同時作用,當然很好想。若只用一個,需用type。
int type;?// type==1 change += 改改改delta 原delta或無則++ 原value則value++?
dnt delta, value;?// type==2 modify = 改value
Problem 2. area??2 seconds?256 MB
給出n 個矩形,求它們的面積并.
更準確一點,每個矩形將給出它的左上角和右下角的位置:x1,y1, x2, y2
這四個數都是整數且滿足x1<=x2,y1<=y2.
我們需要你求:
area =|{ f(x, y) ∈ Z × Z | ??a rect. s. t. x1<=x2 and y1<=y2 }|
分析:掃描線,標記永久化。時候不早了,明天再來。
Problem 3. intkth?3 seconds?512 MB
我看好你喲。
給你一個長度為n 的序列,有m 個操作:
? modify u x 將第u 個數修改為x
? query l r k 詢問區間[l,r] 中第k 小的數
分析:此題很有趣。樹狀數組套線段樹,很好實現。
?
轉載于:https://www.cnblogs.com/Doggu/p/idy_DS.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的旧题新做:从idy的视角看数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android编程获取手机型号,本机电话
- 下一篇: CorelDRAWX4的VBA插件开发(