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