251028 模擬測 總結
拖了好久啦,哎也不能怪我啊,作業那么多而后又病了啊。。。。。。
總之是終于補回來了。/ll
分數不大記得了,好像是 \(90+100+?+? = 220\),總之就是 T1 不該掛分的。
Pro.A
我問你呢,為什么判了左邊界卻不判右邊界?
想都想出來了,卻沒判右邊界。\(\le 0\) 的情況判了啊,咋就不判下 \(> m\) 的情況呢?
還好數據強度不是很高,不然會給我卡光。
大概就是枚舉公差然后算出首項找最大的,然后再在所有里面找最小的。
時間復雜度 \(O(\frac{m}{n} \times n)\),相消了,即 \(O(m)\),過得去。
Pro.B
還好想到了,不過用
set是白整,其實只要記錄度數就可以啦。
轉變一下這個題目的條件,可以發現最后不被踢出朋友圈的人肯定是還沒到他就已經被整成單個兒了的,然后再分析一下,就會發現,如果一個人 \(x\) 沒有與任何一個 \(>x\) 的人直接相連,注意要求的是直接相連,僅僅聯通是不行的,那么這個人就不會被踢出朋友圈。
那這玩意兒咋維護呢,很簡單,記錄 \(d_u\) 表示 \(u\) 這個人和多少個 \(>u\) 的人直接相連了,每次做操作的時候對應進行加減,同步維護答案,查詢的時候直接輸出就好啦。
Pro.C
抽屜原理?真是神秘。
感覺這個題目有一點投機取巧的感覺在里邊(
注意到如果存在三個連續的數,它們在二進制表示下的最高位相同,那么可以選擇對靠后的兩個數進行一次操作,這樣最高位就消掉了,肯定比第一個數小,因此只需要 \(1\) 次操作就行。
由于序列是單調不減的,題目又保證了值域最大 \(10^9\),根據抽屜原理,當 \(n>60\) 的時候必定存在三個連續的數,它們在二進制表示下的最高位相同。這個可以直接判掉。
那么剩下的就只有那些 \(n \le 60\) 的部分了,這個范圍隨便搞,跑個 \(O(n^3)\) 的雙指針一樣的東西就搞完了,甚至可以 \(O(n^4)\) 純直接枚舉,畢竟這個范圍小到可憐呀!
Pro.D
這題還蠻好玩的,雖然代碼不短。
而且細節巨多!
哎我還是不得不說這個思路真的很妙啊。
考慮將這個邏輯關系建成一張圖,一張有向圖,只是一開始還無法定向。對,就讓每組操作的 \(l\) 和 \(r\) 連一條邊。讓邊的出節點視為該操作選擇的民族對應的節點。我們只需要構造一種方案使得每個點的入度均為偶數,因為這樣就可以一半加一半減了。當然如果中途發現無解則直接輸出。
由于圖可能由多個連通塊組成,因此可以用并查集一開始維護一下塊的情況,然后每個塊分別考慮即可,套路是一樣的。
首先能發現無解的情況,當且僅當存在一個連通塊的邊數為奇數,這個時候無論你怎么劃分都做不到所有節點入度均為偶數。
我們只需要關注每個節點的入度的奇偶性即可。只要改變一條邊的方向,相應節點入度的奇偶性就會發生變化。
考慮使用樹的結構來維護這個東西。跑出每個節點的 DFS 樹,對于非樹邊我們隨便定方向,然后對于樹邊則按照奇偶性進行考慮。如果子節點目前的入度為奇數,則要讓它的奇偶性受到改變,否則要保護好它的奇偶性,則只能改變自己。
這樣下來我們就可以實現每個節點的入度均為偶數的情況了,最后再將這偶數次操作對半分,一半加一半減,最后輸出即可。

浙公網安備 33010602011771號