WC2016模擬 計數系統 stones

2021-08-14 02:27:02 字數 1359 閱讀 1676

是不是很容易想到數字dp?

講一下我考場上想到的辣雞做法,從中間向兩邊對稱著做,滿足第三個條件必然在某個時刻出現左端點為0,右端點為1,分成兩段dp。

特別難寫而且自帶乙個大常數在50組資料的加強下可以達到接近n^3

膜拜一下題解:

先考慮字典序嚴格小於,列舉乙個x把它變成i,然後考慮這一段字首對答案的貢獻。

既然要反串大於它,再列舉這段字首其中的乙個i變成x作為字尾,中間一段的答案可以用組合數預處理。

相等的情況也可以用組合數預處理。

注意如果字首長度大於串長的一半要特判。

#include 

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

using

namespace

std;

typedef

long

long ll;

const

int n=2*1e3+5,mo=1e9+7,inv2=5*1e8+4;

int c[n+5][n+5],f[n+5][n+5],g[n+5][n+5];

int n,k,ans,s[n+5],a[n+5];

void inc(int &x,int y)

void prepare()

}fo(i,0,n)

fo(j,0,n)

fo(i,0,n)

fo(j,0,n)

}fo(i,0,n) fo(j,0,n) g[i][j]=(ll)g[i][j]*inv2%mo;

}int calc(int st)

else

if (a[i]1]) break;

int cur=0;

fo(i,2,n) cur+=a[i]^a[i-1];

if (cur<=k&&ok) res++;

}fo(i,1,st) else

if (st>=n-i+1) break;

if (i>1) tmp+=s[i]^s[i-1];

}return res;

}void solve()

ans=0;

fo(i,1,n)

if (s[i])

printf("%d\n",ans+1);

}}int main()

WC2016 論戰捆竹竿

給定 n 長度的字串,初始數字為 n 每次可以給初始數字加上 period or n 求能表示出多少個數 in n,w n le 5 times 10 5,w le 10 求period可以求border 可以表示成 o log 等差數列 等差數列表示成三元組 fir,d,len 分別為首項,公差,...

WC模擬 優美的樹

眾所周知,樹是n 個節點n 1 條邊的結構,而所謂的優美的樹需要滿足如下條件 1.這是一棵有根二叉樹 2.非葉節點需有兩個兒子 3.不可以變換為k 左偏樹。所謂的k 左偏樹是指一棵有k 個葉子的樹,每個非葉節點的右兒子均為葉子且均有左兒子。所謂的變換指的是經過若干次如下兩種變換 1.刪去乙個節點的兩...

2017 1 18WC模擬總結

well,恩今天的表現還好,全場與jason並列第九,但是處於密集分數段,今天其實是想出了兩題的,但是由於第二題很晚才開始認真想,於是就沒打出來了。一開始以為是高斯消元,然後發現不可以之後,利用各種邏輯運算的二進位制下等同的加法和乘法,誤打誤撞的就想到關鍵點上了,於是發現這其實是個圖,有許多鏈和環,...