a.水題
b.題意:有n長的區域來玩塔防遊戲,接下來放置m個防禦塔,每個防禦塔有乙個攻擊區間和攻擊經過這一點時造成的傷害。 接下來q次詢問,問在x位置放置乙個血量為h的怪,能不能通過防守。(n,m的範圍都是1e6, h 1e18)
當時隊友做這道題,將問題抽象成了n個值的線段,m次區間更新,然後計算出每個點的權值,直接o(1)處理詢問。然後暴力肯定是不可以的,不能直接處理累加。根據題意,應該是裸的區間更新區間查詢和的線段樹,用o(nlogn)複雜度。 然後由於當時沒有帶模板,線段樹不熟練,就沒有打。然後我想了乙個辦法就是把每個區間更新的兩個區間斷點拆分,然後將所有區間端點排序,然後用o(n+m)的複雜度處理一次更新所有累加。 這樣題目是過了,但是下來以後發現其實是不用排序的, 可以直接開乙個比較大的陣列,然後將區間拆分放到裡面,然後直接o(n)複雜度就可以。
這個題是先更新所有區間,然後再去查詢,如果是一邊更新一邊查詢可能就只能線段樹了。
c.題意:n個機器,m個任務,每個機器和每個任務都有乙個時間和等級,當機器的時間大於等於任務的時間且等級也大於等於任務的等級,這個機器可以完成這個任務。 每個機器只能完成乙個任務,每個任務只能被乙個機器完成。每完成乙個任務獲得(500*t+2*lev)的錢。 (資料範圍1e6,等級<100)
根據資料範圍,當時想的就是排序然後二分,一層遍歷一層二分可以o(nlogn)複雜度過,但是想法其實是錯的,排序以後也不能保證是否能完成任務處於有序性。
正確的解法是貪心,一直沒有這樣去想。 首先對機器和任務按照先時間後等級從大到小排序。然後從任務開始,按時間查詢能完成它的所有機器,然後講這些機器的所有level存到乙個陣列中儲存,代表每個能完成當前任務的對應level的機器個數。這樣以來,如果當前任務能夠被這些機器在時間上滿足可以完成,那麼後面所有任務都滿足,然後對於當前任務,將滿足情況的機器中取出乙個等級也滿足且最小的機器去完成。 這樣一直對任務掃下去即可。這樣以來就可以用o(100n)的複雜度去貪心。
f.題意:m張背面朝上的撲克,n次操作,每次能夠選取xi張不同的撲克翻面,問所有操作以後有多少可能。 結果對1e9+7取模。(資料範圍1e6)
當時一直去想dp或者其他的辦法,原來就是乙個數學思維的題目,不算難。
將正面朝上看做1, 反面向上看做0, 初始狀態為全0, 易知,最後1的個數一定和操作的總數奇偶性是相同的。 然後只要求出1的最大個數和最小個數,就可以求出最後1的個數的所有可能。 在去求1的組合就可以了,將所有組合加起來就是最後結果。
然後考慮如何去求最大的1的個數和最小的1的個數,資料範圍1e6,所以可以針對每一次操作去模擬,要想得到最大的1,所以有0就翻轉0, 沒有的話只能翻一次1,然後下次就又可以翻0了。這樣就可以根據當前1的個數和操作xi的大小確定每一次操作得到最多多少個1, 一直到最後一次操作。 要求最少的1的個數是一樣的道理。
然後對所有的結果求組合數, 組合數涉及到了除法模運算,所以對分母上的數字求一下逆元,mod是質數,直接用費馬小定理就可以了。
h.題意:題意比較複雜,簡單來說,就是找一組數(每個數字<1e5),對於每乙個數,找到它之前的數中是它倍數的最大的數的下標,找到它之後的數中是它倍數的最小數字的下標。 如果沒有,就返回它自己的下標。然後求每個數字的這個東西。(資料範圍1e5)
由於數字大小不超過1e5,可以預處理獲得所有數字的所有因子,放到乙個vector陣列儲存。然後通過兩次遍歷,一次正向遍歷找之前的數字,一次反向遍歷找之後的數字。在正向遍歷的時候,對於每乙個數字,根據預處理,可以得到它是哪些數字的倍數,然後儲存這些數字中的最大倍數的下標。 這樣每次找到下乙個數字的時候就可以直接獲得它之前的倍數的最大的下標。 在反向遍歷處理的時候是一樣的,只不過維護乙個最小值即可。
bugku web 系列題目思路總結(七)
檢視原始碼,有upload.php,結合題目應該是關鍵資訊。進入 上傳檔案。參考部落格 第一種方法 上傳一句話木馬,上傳檔案1.php jpg。鏈結菜刀失敗。第二種方法,構造語句 由於恰好flag檔案在根目錄,在訪問這個檔案即可得到密碼。訪問檔案方法 直接網域名稱訪問。包含檔案訪問 題過了,菜刀還是...
大一寒假acm訓練 小題目總結
include include include includeusing namespace std int t,vis 105 grid 105 105 arr 105 len 105 int bfs int index que.pop return sum int main if v int d...
PTA 佇列模擬題目型別總結及解題思路 C
如1014,1017,1026,以下給出1017題目 如1006,1016,1095,以下給出1016題目 如何處理輸入的資料?int month,day,hour,min scanf d d d d month,day,hour,min 一般講所有的時間轉化為讀入的最小時間單元,用乙個變數儲存。在...