這是同機房一位巨佬在ak ioi之後發表的感言。
為了學習他的這種精神(我太菜了,但我也想像他一樣ak ioi qaq),這篇題解就誕生了。
戰車被馬拉著
直接模擬。注意入隊的時候打上標記,出隊的時候清楚標記,每次查詢的時候直接o(1
)o(1)
o(1)
查詢標記即可。
時間複雜度o(n
)o(n)
o(n)
。一直在那裡想二分,結果云云出來乙個o
(log1
09n2
)o(\logn^2)
o(log109
n2)的解法(剪枝一下跑不滿)……我太菜了……
我們考慮貪心。記u,v
,wu,v,w
u,v,
w為一條無向邊,表示u
uu這個罪犯與v
vv這個罪犯之間的衝突值為w
ww。按w
ww從大到小排序之後,我們從前往後掃瞄一遍,盡量讓當前這兩個罪犯被安排在兩個不同的監獄。如果已無法避免(比如之前已經決定了1
11與2
22, 2
22與3
33這兩對罪犯分別在不同的監獄,那麼我們就無法避免1
11與3
33在相同的監獄)就直接輸出當前的w
ww。這個可以使用擴充套件域並查集完成。
最後,注意如果可以避免所有的衝突應該輸出000。
時間複雜度為o(n
logn
+mlo
gm)o(nlogn+mlogm)
o(nlog
n+ml
ogm)
。很裸的dpdp
dp。狀態設計: dpi
,a,b
,c,d
dp_dp
i,a,
b,c,
d表示看到了第i
ii個位置,四種卡片分別用了a,b
,c,d
a,b,c,d
a,b,c,
d張。狀態轉移十分顯然,略掉。
可以發現,狀態過多,會mle
mleml
e與tl
etle
tle。
現在,我們要⌊
\lfloor
⌊用盡可能少的維度去描述乙個狀態的輪廓 ⌉
\rceil
⌉。可以發現,a,b
,c,d
a,b,c,d
a,b,c,
d與ii
i之間有乙個等量關係,即
1 +a
+2b+
3c+4
d=i1+a+2b+3c+4d=i
1+a+2b
+3c+
4d=i
於是,我們就可以隨意省去一維,就做完了。
時間複雜度o(4
03n)
o(40^3 n)
o(403n
)。下面的解法保證正確,但與官方題解甚至所有題解都有不同之處,完全原創!
首先,我們建圖,u
uu到v
vv連一條有向邊當且僅當水可以用u
uu流到v
vv。可以發現,這是乙個dag
dagda
g(什麼?你說這裡面會有環?你的意思是3
>
2>
1>
33>2>1>3
3>
2>
1>
3嗎)。於是我們可以通過一遍拓撲排序來求出第一行上的每個節點分別可以到最後一行的哪些節點。
但是,僅僅到這裡的複雜度就退化成了o(n
m2)o(nm^2)
o(nm2)
。怎麼辦呢?可以發現,我們問的是"能否到達",可以壓縮為乙個01
0101
的狀態。但是,最後一行有500
50050
0個位置你怎麼壓?我們套路地拆開這個二進位制數,拆成8
88個甚至9
99個無符號整形量來轉移,不就行了嗎。時間複雜度是o(n
m)o(nm)
o(nm
)。是不是很神奇
首先,特判一下「不能」的情況。如果第一行全部安排蓄水池都不行,那麼就顯然是「不能」的情況。只需要再用 int512 上面所說的拆開的方法,把第一行所有格仔的狀態給或一下,看看是否每一位都是1
11即可。
接下來,怎麼辦呢?在noip 2010的考場上本蒟蒻就想到了這一步,後面就不會做了qaq
可以發現,此時所有第一行格仔能夠到達的最後一行的位置,一定是一段連續的區間。對,一定是一段連續的區間。這是乙個無比重要的性質。
簡要證明一下: 如果這不是一段連續的區間,假設空出來的是第k
kk個位置,那麼顯然第一行其他的所有位置都無法到達k
kk。那麼這應該歸為無解的情況,在有解的情況下是絕對不會出現的。
所以,現在我們將乙個二進位制的狀態轉換為乙個區間[l,
r][l,r]
[l,r
]。然後,我們相當於要選擇盡可能少的區間去覆蓋最後一行,這個就是乙個裸的貪心——按左端點排序,左端點相同按右端點排序,直接從前往後掃一遍即可。即,我們每次在保證左端點小於等於之前選的右端點,無空格的情況下,讓右端點延伸得最遠,這是貪心的思想。
總時間複雜度o(n
m)o(nm)
o(nm
)。此題得到完美解決。
NOIP2010提高組 引水入城
這題。以前打的,很暴力的bfs include include using namespace std int a 502 502 ll 502 rr 502 data 300001 2 bool bz 502 502 int temp,n,m const int way 5 2 void bfs ...
NOIP2010 提高組 關押罪犯
s 城現有兩座監獄,一共關押著 n 名罪犯,編號分別為 1 n 他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為 c 的罪犯被關押在同一監...
NOIP2010提高組 烏龜棋
這題一眼dp,本來是設五維的 但是,咳咳,空超了!如何?我們在仔細地看一看dp陣列 我們可以發現,因為,當我們確定了剩下的卡片,我們就能確定了它當前所在的位置是 所以,我們可以直接將i去掉,perfect!那這樣的話,我們只要設四維就可以了。include define max x,y x xusi...