前四天看了一下國慶**的題目,只出了e題。
這個題目要求求區間最值,區間最值其實和區間求和差不多,就是將sum陣列的含義轉移到
max,然後通過特定的區間更新
max。
在區間求和中,當我們維護max[i]的時候,要找到它前面所有的
max[j]
來更新,畫圖可知,
max[i]
需要的max
只有max[i-2^0],max[i-2^1],max[i-2^2]..max[i-lowbit(i)+1]
。求區間最值時,很容易看出,我們找[l,r]的最值就是找在次區間的
max,即遞減
r,在這裡可以有個優化,即當找到乙個
max[i]
,有i-lowbit(i)>=l
時,更新後,i直接
-=lowbit(i)
,然後繼續遞減,當l>r就跳出迴圈。
a題:因為操作中只有詢問沒有更新,可以對所有問按右區間公升序排序。以該數字第一次在區間中出現的點代表所有的點。如果是第一次出現,那麼該數字在之前從未出現或上一次出現不再區間內。記錄每個位置i的數字的前乙個相同數字出現的位置
hash[i]
,沒有前乙個相同的
hash[i]為0
。然後從前到後掃瞄詢問,每次將上乙個同值點的值加
1,然後求當前區間的左界的字首和就是答案了。將當前位置下個位置的值減
1,這樣做可以保證任意乙個數字在任意一段區間中最多出現一次。但是一直都是超時...
後面幾天做了樹狀陣列和線段樹的專題。
樹狀陣列d題:
題意:共n個數,m次操作,q表示詢問n個數有多少順序數,r a,b表示區間[a,b]中的數轉動一下(a+1~b每個數向前移動,a位置的數到b位置).
思路:如果每詢問一次就求一次順序數很費時間,先求出最初的順序數ans,每轉動一次時如果a+1~b位置的數大於a位置的數,ans--,如果小於a,ans++,那麼就用到了數狀陣列求逆序數
。樹狀陣列f題:
題意:n*n*n的立方體,元素為0或1(初始為0)。1操作將(x1,y1,z1)到(x2,y2,z2)之間的元素取反;0操作是詢問(x,y,z)為0或1。
題解:三維樹狀陣列,原理跟一維,二維一樣。
樹狀陣列o題:
題意:
black x y l是指將第x行,y列到第x+l-1行,y+l-1列翻成黑色(初始化時為白色)
white x y l是指將第x行,y列到第x+l-1行,y+l-1列翻成白色(初始化時為白色)
test x y l是指求從第x行,y列到第x+l-1行,y+l-1列中白色的有幾個。
解題思路:
這個題目可以用樹狀陣列來做,更新乙個二維區間,查詢乙個二維區間兩個函式,其中更新區間。
還看了看線段樹中關於掃瞄線的知識,是之前看hdu 1828的問題了解的,本題求得是周長,所以將所有上下位邊按
y從小到大排序之後
:首先我們讀入第一條掃瞄線(下位邊
+1),
這條掃瞄線的長度直接加入
ans結果中.y
軸的),
所以這兩條豎向邊從第一條掃瞄線到第二條掃瞄線之間是會增漲的
,所以總周長
ans+=2*(
第二條掃瞄線的高
h2-第一條掃瞄線的高
h1).
然後我們讀入第二條掃瞄線(下位邊
+1):
由於我們更新完這條掃瞄線後,sum[1]覆蓋的範圍擴大了
5,所以
ans先加
5.其次這個時候
,我們的豎向邊由兩條變成了3條
,所以ans+=3*(
掃瞄線3
的高度h3-
掃瞄線2
的高度h2).
然後我們讀入第三條掃瞄線(上位邊
-1):
由於我們讀入該掃瞄線後sum[1]的覆蓋值少了
5,但是此時我們看圖知道其實這個矩形的另一條上邊了
.所以我們不能用
ans+=sum[1]了,
我要執行
ans+=abs(last-sum[1]),
其中last
是上一輪讀入掃瞄線後
sum[1]
的值。
第六周訓練總結(4 5)
這周刷題主要是以線性dp為主,按照慣例,先陳述一下這週的感受。接觸dp有一段時間了,很難的乙個專題,能看題解看明白,但自己怎麼著都想不過來。應該是從上週日開始,連續兩天碰到了許多求最大欄位和的問題,也從中學到了許多,下面會主要介紹一下介紹一下。不過這周雖然主要進行的dp的刷題,但搜尋卻出現的頻率挺高...
第六周總結
2 關於register 提高速度 儲存型別說明符 register要求變數儲存在cpu暫存器中,所以不能用取位址符 取其位址,並且,在全域性變數的地方不能出現register 防止儲存型別不唯一引起的衝突。同時,register 變數必須是能被cpu暫存器所接受的型別。這就意味著,register...
總結第六周
這一周從時間意義上也算是國慶假期後的第一周,學弟學妹也正式踏入了校園,我們工作室的招新工作也相繼展開,截止到此時此刻,還有資料專業和物聯專業的學弟學妹沒有來到我們工作室進行參觀,這兩天也挺累的,但也從中收穫到了許多東西,比如 在人多的時候講話可以更淡定一點,沒有那麼緊張 跟學弟學妹交流用怎樣的方式更...