第一題:
題目大意:
給出n個數的數列,如果相鄰的兩個數加起來是偶數,那麼就可以把這兩個數消掉,求最多能消掉多少數。
解題過程:
1.先自己手工模擬了幾組資料,發現不管消除的順序如何,最終剩下的是一定的。所以就可以每次任意找兩個奇偶性相同的消掉。
於是就想到可以用雙向鍊錶來模擬。
2.更好的方法:直接用乙個棧來模擬,每次加入乙個元素,如何和棧頂元素奇偶性一樣就彈出棧頂元素。
初始得分100.
第二題:
題目大意:
給出n個數的數列,定義區間[l,r]的權值為al and al+1 and al+2...and ar 。 求是否有權值為0~m的區間。
n<=500000. ai
<=1000000
解題過程:
1.這題真心想不到正解,我就用了很多小優化騙過去了。
優化一:如果從乙個左端點向右延伸,已經權值為0了,那麼繼續延伸下去還是0,就可以停止了。
優化二(來自lsdsjy):如果當前權值的二進位制表示只有1個1了,那麼就可以停止了(如果這樣的話還要判斷一下會不會出現0).
其實只有優化1的情況下對於隨機生成的資料已經能夠秒出了。不過還是不大放心,我又用類此並查集的get_father函式的方法來優化。
優化三:對於每乙個元素,記錄它右邊第乙個and 它的結果不等於它本身的數。 這樣就可以乾掉那些有很多重複的數字連在一起的資料了。
優化四(可能會導致wa):如果確定左端點一直延伸下去很多次,權值都沒有變化,那麼就退出。至於這個」很多次「具體是多少自己看著辦吧,我是80次。
另外說明一下怎麼卡掉優化一:只要所有數都是奇數,那麼怎麼and都不會是0,就退化到o(n2)了。
2.ac演算法:從左往右掃瞄,用乙個pre[i]表示當前掃瞄到的所有數中,二進位制表示(從右往左數)第i位為0的最右邊的數的位置.然後對於當前掃瞄的數x,以它為右端點,把所有pre排序,依次and pre陣列裡的數就可以了。
初始得分100.
第三題:
題目大意:
n個車站之間有m條鐵路,這些鐵路分別屬於不同的公司,不同公司的鐵路**不一樣,但都是是隨著長度的增加而增加的。
也就是說從a到b的路線可以分成x段,每段都是同一家公司的鐵路,每段單獨算錢。
求a到b的最小花費。 n<=100,m<=5000,公司的數量<=20
解題過程:
1.這題看起來條件很多,其實沒啥好怕的,實際上可以分成3個子問題。
子問題一:求出每家公司長度為x的鐵路的花費。
子問題二:求出任意兩點間只用公司c的鐵路的最短路。
子問題三:計算a到b的最小花費。
2.對於子問題一,根據題目給的公式遞推就可以。子問題二是關鍵,由於資料範圍很小,所以可以直接用floyd變形一下來做,加一維表示狀態就可以了。對於子問題三,可以用dijkstra來做,只不過轉移的時候多來一重迴圈(列舉到底用的是哪家公司的鐵路)。
初始得分70.原因是計算子問題一的陣列開的太小了。
總結:1.許多時候在考場上想不到很靠譜的演算法,但是許多演算法只要沒有碰到噁心的資料都是可以做的,那就盡量先寫出來,能拿多少分是多少。比如t2。
2.靜態查錯的時候不要只盯著最關鍵的那個函式看,陣列的大小,變數名等等都要仔細的檢查。
3.盡量在考試結束前10分鐘就停止打**。
省常中模擬 Test1 Day1
臨洮巨人 排序 題意 在字串中找出 a b c 三個字母出現次數相同的區間個數。初步的解法是字首和,用 a i b i c i 表示在位置 i 之前 包括 i 各有 字母 a b c 多少個,列舉區間的左右端點 l 和r,若a r a l 1 b r b l 1 c r c l 1 則是一組解。o ...
省選 NOI刷題Day1
bzoj4864 splay亂搞 bzoj3669 正解lct,考慮上下界的spfa可過 bzoj3668 位運算 暴力 bzoj3670 kmp dp bzoj3671 含有最小的乙個數的路徑一定比不含的優 貪心 bzoj1564 按數值排序,就得到了那個treap的中序遍歷,用dp l,r,k ...
GDOI模擬4 24 4 26總結DAY1
day1 第一題,一看就知道是字尾陣列,不過忘記了字尾陣列有乙個東西怎麼線性處理,所以就只能夠暴力搞字尾陣列,所以也只能暴力搞字尾陣列,然後暴力的來求。把height從大到小填進去是乙個很套路的東西,但是只打過一次字尾陣列,對他的用法還不太熟練。所以對於很多省選的知識,由於打得不多,所以很多東西還不...