終於到學校進行模擬了!
(結果下午又通知有颱風導致26號下午和27號停課了)
(最後27號颱風繞道了走一滴雨都沒有看到)
模擬的t1是clique(洛谷傳送門)
這是一道cf原題
我一開始寫的是暴力的做法結果最後提交的時候所有的點全部都wa了直接爆零
後來下午講題的時候lxy同學講的這道題發現這道題居然是有(n)的線性做法的!
(lxy yyds!)
先貼上一下原題大意:
題目描述首先來分析一下題目:數軸上有 n 個點,第 i 個點的座標為 xi,權值為 wi。兩個點 i,j 之間存在一條邊當且僅當 abs(xi−xj)≥wi+wj。 你需要求出這張圖的最大團的點數。
團的定義:兩兩之間有邊的頂點集合。
輸入格式
第一行乙個整數 n,接下來 n 行每行兩個整數 xi,wi 。
輸出格式
一行乙個整數表示答案。
我們有n個點,對於每個點有乙個座標和乙個權值。只有當|xi-xj|>=wi+wj時二者之間才能夠相連
我一開始的想法是進行n²的遍歷,直接萬能o(n²)。雖然樣例點過了,但是出了一些莫名其妙的鍋,評測的時候所有點直接全部wa掉爆零。
所以也就不詳細說o(n²)的做法了
直接講一下下午講題所講的o(n)做法
首先,我們知道了乙個基本事實:
1.只有當|xi-xj|>=wi+wj時二點之間才能夠相連
1°那麼不妨設xj>xi
∴則有xj-xi>=wi+wj
∴xj-wj>=xi+wi
所以對於所有點的座標在右邊的點,我們只需要使得其x-w大於其左面的點的x+w即可了
2°設xi∴則有xi-xj>=wi+wj
∴xj+wj<=xi-wi
在這種情況下所有點的座標在右邊的點,我們需要使得其x+w小於其左邊的點的x-w即可
(這兩種情況均可構造**,最大的區別是cmp的不同)
然後我們會想到講乙個點的所有元素均放置到乙個結構體內,然後按照其中的乙個元素進行排序即可
然後我們就需要來考慮如何排序了
ⅰ.首先考慮能否用x排序呢?
答案是否定的。
為什麼?
(因為我親自用x排序之後測了一遍發現不行)
因為用x排序的話是不滿足貪心的策略的,也就是說,用x進行排序的話所求的答案並不是我們想要的最大值。
比如說這組資料:
401view code108131
161
我們採用1°的策略進行運算,我們最終會發現所得的值為2。
但是我們只要稍加計算便可以發現實際上最大值為3。
為什麼會有這樣的結果?
原因便是我們使用了x進行排序並沒有符合貪心演算法的規定。
所以看到這組資料我們便想到可以用x+w進行排序!
ⅱ.用x+w進行排序
由於我們最後在1°中最終推導出來的式子為xi-wi>=xj+wj
所以便應當對x+w進行公升序排序然後用每乙個後面的x-w來與前面的x+w進行比較,如果符合大於等於的關係的話就說明答案可以更新
此處規定i,j為按照x+w排序後的先後順序排列,i在前,j在後
那麼此時就會有乙個問題了?因為此時i,j是通過x+w進行排序的,那麼不一定有xixj的話不就違背了1°的前提條件了嗎?如此說來1°不就應該不成立了嗎?
所以在此對這個問題進行一下證明(此處也是我之前一直無法理解的難點):
那麼在這個已經按照x+w為cmp排序標準的陣列中,我們已知在這個陣列中的下表中 i所以我們可以得到在這種條件下只需要使用1°的判斷策略就可以了(因為2°的情況無影響)那麼我們就已知xi+wi<=xj+wj
如果xi
如果xi>xj,則1°不成立,則上述所描述的規則的前提條件不成立
所以在此時2°成立,我們應當判斷是否有後面的x+w小於等於前面的x-w
即判斷是否有xj+wj<=xi-wi
但是由於我們已知xi+wi<=xj+wj,以及w>=1
xi-wiwi
又通過xi+wi<=xj+wj
所以易得xi-wiwj
此既定事實與所希望求得的xj+wj<=xi-wi矛盾
所以一定不存在通過x+w排序的陣列中存在xi>xj且能夠更新答案的情況
qed.
把這種做法的ac標程貼在此處:
1 #include2ⅲ.用x-w進行排序#define n 210000
3using
namespace
std;
4int n,ans=1,t=1;5
struct
nodea[n];
8bool
cmp(node q,node w)
11int
main()
18 sort(a+1,a+1+n,cmp);
19for(int i=2;i<=n;i++)24}
25 printf("%d"
,ans);
26return0;
27 }
當時講題的時候大家都是用x+w進行排序的,從而預設講2°的判斷策列直接排除掉了
那麼我在理解了這道題後就在思考2°的策略能夠進行相關的應用呢?
答案是肯定的。
其實對x-w進行排序的主要思路與ⅱ做法相差不大,只不過排序需要進行降序排序,並且要運用2°的判斷策略罷了
把這種做法的ac標程貼在此處:
1 #include2ⅳ.用w進行排序#define n 210000
3using
namespace
std;
4int n,ans=1,t=1;5
struct
nodea[n];
8bool
cmp(node q,node w)
11int
main()
18 sort(a+1,a+1+n,cmp);
19for(int i=2;i<=n;i++)24}
25 printf("%d"
,ans);
26return0;
27 }
說實話用w進行排序的錯誤性我還真的沒辦法進行說明(主要是因為一看就不可能)
如果要進行闡述的話那麼就是因為w和x是平級的關係,既然用x進行排序都是不可以的,那麼用w進行排序必然也是不可以的(感性理解)
可能看到此處有人就會驚訝了:這道題又不是平面直角座標系,他只是乙個數軸怎麼可能進行數形結合呢?
答案是:雖然這只是乙個數軸,但仍然是可以進行數形結合解釋的。
因為我們已經知道了w>=1所以我們可以將x-w到x+w理解成乙個區間[ x-w , x+w ]
而兩點之間可以連線一條邊的條件便是兩個區間之間沒有交點或者交集只有乙個點
是不是突然很簡單明瞭了!
其他的思路什麼的就可以結合此處的數形結合思想從而更好地理解上述純數學推導方法中的內容了。
the end.
16 1112 模擬考試 T1
加密 問題描述 有一種不講道理的加密方法是 在字串的任意位置隨機插入字元。相應的,不講道理的解密方法就是從字串中恰好刪去隨機插入的那些字元。給定原文s和加密後的字串t,求?有多少子串可以通過解密得到原文s。輸入格式 輸入第一行包含乙個字串t,第二行包含乙個字串s。輸出格式 輸出一行,包含乙個整數,代...
20220219模擬 T1貨幣
我們考慮設 f i 表示當 i 作為右端點的時候,它的左端點最大是多少能夠包含所有顏色 我們考慮設 nxt i 表示 i 後面第乙個和它顏色一樣的位置是 那麼 f i 的計算方式就是 min 我們發現我們用 set 維護 pos 啟發式合併就可以在求 nxt i 的地方做到 o n log 2 n ...
4 21小A模擬賽 T1
description 乙個無限長的01 序列,初始全為0,每次選擇乙個區間 l,r 進行操作,有三種操作 1 l r 將 l,r 中所有元素變成1。2 l r 將 l,r 中所有元素變成0。3 l r 將 l,r 中所有元素異或上1。每次操作後詢問最左邊的0 在哪個位置。input format ...