省常中模擬 day1

2022-04-30 10:18:07 字數 1619 閱讀 6050

第一題:

題目大意:

給出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從大到小填進去是乙個很套路的東西,但是只打過一次字尾陣列,對他的用法還不太熟練。所以對於很多省選的知識,由於打得不多,所以很多東西還不...