括號序列與豬豬俠又大戰了起來。
眾所周知,括號序列是乙個只有(和)組成的序列,我們稱乙個括號序列s合法,當且僅當:
1.( )是乙個合法的括號序列。
2.若a是合法的括號序列,則(a)是合法的括號序列。
3.若a,b是合法的括號序列,則ab是合法的括號序列。
我們考慮match[i]表示從左往右數第i個左括號所對應的是第幾個右括號,現在他得到了乙個長度為2n的括號序列,給了你m個資訊,第i個資訊形如ai,bi,表示match[ai]但是你發現這個豬豬俠告訴你的資訊,可能有多個括號序列合法;甚至有可能告訴你乙個不存在合法括號序列的資訊!
你最近學了取模運算,你想知道答案對998244353(7172^23+1)取模的結果,這個模數是乙個質數。
第一行乙個正整數t,t< = 5,表示資料組數。
對於每組資料,第一行乙個n,m,n表示有幾個左括號,m表示資訊數。
接下來m行,每行兩個數ai,bi,1< = ai,bi< = n。
對於每組資料,輸出乙個數表示答案。
51 0
5 03 2
1 22 3
3 22 1
2 33 3
1 22 3
3 11421
20對於前兩個點,是卡特蘭數的情況。
對於第三個點,合法的情況只可能是 ()()()。
對於第四個點,合法情況可能是 (()()) 或者 (())()
對於第五個點,由於拓撲關係形成了環,顯然無解。
對於 100% 的資料,保證 n < = 300
考慮區間dp
\(dp_\)表示滿足\([l,r]\)的左區間滿足條件的方案數
然後你每次考慮在\([l+1,r]\)的個區間中加入l這個括號
有三種情況:
全部包含後面
和後面相離
把後面分成兩半
然後發現我們要處理出兩個區間分離沒有任何衝突的方案數
這個東西可以對match的二維矩陣做乙個字首和sum
然後\([l_1,r_1]\)
\([l_2,r_2]\)的衝突個數就是\(l_1,r_1\)~\(l_2, r_2\)子矩陣的和
#includeusing namespace std;
const int n = 310;
const int mod = 998244353;
int f[n][n], p[n][n], q[n][n], sum[n][n];
int a[n][n], b[n][n];
int n, m;
int add(int a, int b)
int mul(int a, int b)
int calc(int x1, int y1, int x2, int y2)
void solve()
if (bk)
for (int i = 1; i <= n; i++)
} for (int len = 2; len <= n; len++)
} } printf("%d\n", f[1][n]);
}int main()
BZOJ4350 括號序列再戰豬豬俠
括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...
bzoj4350 括號序列再戰豬豬俠
括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...
bzoj4350 括號序列再戰豬豬俠 區間DP
括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號 序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對...