考試反思 0502省選模擬86 恐懼

2022-02-03 01:18:21 字數 3212 閱讀 5941

還是狀態持續不佳。但是今天沒那麼困,雖說腦子還是不想動。

一看到原題就慫,毛病。

好像考場上遇到原題的話,得分會比非原題還低。。。

$t2$作為原題就直接放棄正解了(?),然後乖乖的打部分分,結果教練把子任務放錯了於是丟了$15pts$

(放錯子任務同時也導致:直接輸出$0$能多$20$分。。。啊人就應該有信仰啊為什麼我沒輸出$0$啊。。。)

$t1$的話有乙個比較套路的$o(n^3)dp$。

然後乙個組合恒等式一小時硬是沒看出來耽誤很長時間,後來突然覺得自己是弱智就發現了,優化一下過去了。

$t2$的話基本沒花時間寫暴力跑路。然而雖說$+15pts$貌似影響不大。

$t3$的話是最後沒多少時間的時候看的,想寫$n^2$暴力的時候順手加了點剪枝。

寫完之後發現:誒這複雜度好像挺對的是$o(n^)$的然後就快樂的交上去了。

結果被卡常了掛了$30$這又告訴我們乙個道理$unordered\ map$不用的元素一定要及時清空。

不然自家$oj$的速度$o2,4s$跑$2 \times 10^7$都能被卡常。。。

t1:人生

大意:求有多少$n$點有向圖(隨意加邊並給所有點黑白染色)滿足:邊由小編號指向大編號,邊端點顏色不同,圖中的本質不同路徑數為奇數。有些點的顏色已確定。$n \le 2 \times 10^5$

$dp$的味道。

因為所有邊都是從小標號指向大標號所以我們就可以按照標號從小到大考慮。

$dp[i][j][k]$表示考慮了前$i$個點,有$j$個白色奇數點,有$k$個黑色奇數點。

最暴力的思路是,如果當前點是黑色的就列舉它要與多少個白點連邊(剩下的邊連不連沒影響直接$2$的冪)。可以做到$o(n^4)$

然後發現轉移係數只與$j,k$而與當前考慮$i$無關所以可以預處理,是組合數的和。可以做到$o(n^3)$

發現轉移係數是$\sum\limits_^} \binom= \sum\limits_^} \binom = 2^$

特殊處理$n=0$。然後轉移係數就變成了形如$2^\times 2^=2^$就與$j,k$無關了。

只要維護它們是奇數還是偶數,是不是$0$即可。$o(n)$

1 #include2

#define mod 998244353

3#define s 200005

4int dp[2][3][3

],n,c[s],pw[s],ans;

5int t(int x)

6int

main()

view code

t2:贏家(winner)

大意:無向圖,求有多少邊定向方式使得$1,2$號點可以到達的點存在交集。$n \le 15$

首先直接做不好做,用總方案數減去不存在交集的方案數。

那麼我們就可以$o(3^n)$列舉$1,2$號點的可達集合$s,t$。

如果我們求出了將$s$集合內邊定向後$1$號點能到達$s$內的所有點的方案數$f(s),g(t)$同理。

那麼考慮這個$s,t$對答案的貢獻就是:剩餘部分的匯出子圖都隨意連邊,而剩餘部分的點與$s,t$之間的連邊都指向$s,t$。當然$s,t$之間不能有邊。

問題在於求$f,g$。同理我們用所有方案減去不合法的,列舉真子集表示真實能到達的點集減掉:真實部分是$f(s)$,然後$s$與$s-s$之間的邊方向也是確定的,$s-s$內部隨便連。

總複雜度$o(n^3)$

1 #include2

#define mod 1000000007

3int e[1

<<15],n,m,f[1

<<15],g[1

<<15

],ans;

4int

main()

12for(int i=1;iif(i&1)16

for(int i=1;iif(i&2

)20 ans=e[s-1

];21

for(int i=1;ifor(int u=s-1^i,j=u;j;j=j-1&u)if(e[i|j]==1ll*e[i]*e[j]%mod)ans=(ans-1ll*f[i]*g[j]%mod*e[s-1^i^j])%mod;

22 printf("

%d",(ans+mod)%mod);

23 }

view code

t3:黑紅兔

大意:給定字串$s$,要求最大化$k$使得存在$k$個不相交的子串按照左端點排序後,後乙個是前乙個的嚴格子串。$n \le 5 \times 10^5$

首先考慮一種暴力:不難發現因為是嚴格子串所以最優解一定是長度分別為$k,k-1,k-2...3,2,1$的串。

這樣答案的級別是$o(\sqrt)$的。雜湊一下逐層列舉就可以做到$o(n^)$

設$f[i]$表示最大的長度滿足存在一種選法包含$[i,i+f[i]-1]$這個子串

觀察$f$的性質,發現左端點左移$1$時$f$最多增加$1$

所以倒著掃一遍,檢查當前的$f[i]$是否合法,如果不合法就把以$i+f[i]$開頭的所有合法子串都加入,然後使$f[i]--$

考慮乙個小優化:如果你在加入所有子串的時候發現當前串已經出現了那麼更短的串也一定都加入過了直接跳出。

這樣的話複雜度就是$o(n+s)$。$s$表示有多少種本質不同的合法子串(位置不同字元相同當作本質相同)

複雜度大約是線性的。跑得飛快。

1 #include2

using

namespace

std;

3#define ull unsigned long long

4 unordered_setm;

5int n,f[500005],ans;char s[500005];ull h[500005],pw[500005

];6 ull hsh(int l,int r)

7void upd(int x)

8int

main()cout

17 }

view code

正解稍微優雅一些:首先$sa$一下就可以求出$lcp$

然後我們求$f$的時候要查詢的就是$rk$在一定區間內的數中最大的$f$

$o(nlogn)$

考試 省選86

t1 首先設出暴力的 dp dp i j k l 為前 i 個點中有 j 個白點結束方案為奇數,k 個黑點結束方案為偶數,當前全部的結束方案之和奇偶性為 l 的方案數。那麼可以很簡單的轉移。在考慮轉移時候的係數。其實只跟 j,k 是否為0有關係。那麼狀態大大化簡為 dp i 0 1 0 1 0 1 ...

省選模擬86

首先考慮基礎的dp定義,那麼發現轉移需要的係數只和dp是奇數的點的個數有關,所以將這個東西記錄在dp狀態中就行了。然後推一下dp轉移,發現轉移係數和奇數的點的個數沒有關係,只與是否存在這樣的點有關,所以用01來記錄就可以了。考慮用總方案減去不合法的方案,也就是1號點能到達的點和2號點能到達的點沒有交...

考試反思 0316省選模擬47 偏頗

這套題的考察思路其實不錯。三暴力,掛乙個。t1 是送分,但是一眼覺得是大資料結構,於是直接扔掉了。結果竟然是個原題。dy 講的只記住了只言片語思路早就忘了。好歹這次會了。t2 的話寫了個亂搞,結果把本來到手的 20 給寫死迴圈了,加了句判斷就 50 了。t3 差不多想到正解了,但是毒瘤出題人不給部分...