LOJ6436 PKUSC2018 神仙的遊戲

2022-04-28 20:21:13 字數 1364 閱讀 8989

loj

給你乙個只有01?的字串,問你是否存在一種把?改成01的方案使串存在乙個長度為\(1-n\)的\(border\)。\(n\le5\times10^5\)

這種題都不會我還是太菜了。

有一檔部分分是「01的個數不超過\(5000\)」。這個其實對正解的提示是蠻大的。

有乙個顯然的結論:存在乙個長度為\(len\)的\(border\)當且僅當對於\(\forall i\in[1,len]\) 有 \(s[i]=s[n-len+i]\)。(感謝熱心網友找出這裡的乙個錯誤)

或者這樣說,把所有位置在模\(n-len\)意義下分組,同一組裡的01要全部相同。

那麼,如果存在一組01他們的下標之差為\(x\),那麼所有\(y|x\)的\(n-y\)都不可能成為\(border\)。

這樣\(67\)分就可以寫乙個\(5000^2\)列舉01對統計,然後每次掃一遍倍數\(o(n\log n)\)計算答案。

考慮正解。現在的複雜度瓶頸在於列舉01對。

搞兩個生成函式\(a(x)\)和\(b(x)\),\(a(x)=\sum_^[s_i==0]x^i\),\(b(x)=\sum_^[s_i==1]x^i\)。

我們知道,多項式卷積計算的是所有下標之和為一定值的乘積之和,也就是\(c_i=\sum_a_jb_k\)。現在我們要統計的是差為定值的。

把乙個多項式\(reverse\)過來不就好了麼。形式化地,令\(a(x)=x^a(\frac 1x)\),然後計算\(c(x)=a(x)b(x)\)得到的第\(i\)次項係數就是滿足「1的下標減0的下標等於\(i-n\)」的01對數。

複雜度\(o(n\log n)\)。

#include#include#includeusing namespace std;

int gi()

const int n = 3e6+5;

const int mod = 998244353;

int n,len,a[n],b[n],rev[n],l,og[n];

char s[n];

int fastpow(int a,int b)

return res;

}void ntt(int *p,int opt)

if (fg) ans^=1ll*(n-i)*(n-i);

} printf("%lld\n",ans);return 0;

}

PKUSC 2018 真實排名

戳我 我們將現在所要進行的數設為 now 我們分情況討論一下 他自己不翻倍 他自己翻倍 我們首先來看看 1 操作 如果要滿足他對排名沒有影響,那麼不能進行翻倍的數只有 lceil frac rceil,now 我考場上不知道在幹嗎,寫的是能進行翻倍的數,麻煩好多,常數也大 我們假設這一段為 cnt ...

PKUSC2018 真實排名

對每個數,先分類討論,將答案分為這個數有翻倍和這個數沒翻倍。在討論前,我們規定 low x 為小於等於這個數的數的個數,當前數為 x 如果這個數沒翻倍 我們考慮哪些數翻倍不會影響這個數的排名,一種是翻倍後依然小於 x 的,一種是本來就大於等於 x 的。那麼對於第一種情況,情況數為 c low x 1...

PKUSC2018 最大字首和

看資料範圍認解法 首先在每種情況出現概率相同的情況下,期望 times 方案數 權值和 即題意就是讓你求所有排列的最大字首和的總和 我們可以列舉哪些數是最大字首,顯然這些數內部任意交換順序 其它數內部任意交換順序 都不會改變這個最大字首。一些數要排到前面去成為最大字首,條件是該字首除整段外的所有字尾...