BZOJ4350 括號序列再戰豬豬俠

2022-05-03 23:33:21 字數 1846 閱讀 8969

括號序列與豬豬俠又大戰了起來。

眾所周知,括號序列是乙個只有(和)組成的序列,我們稱乙個括號

序列s合法,當且僅當:

1.( )是乙個合法的括號序列。

2.若a是合法的括號序列,則(a)是合法的括號序列。

3.若a,b是合法的括號序列,則ab是合法的括號序列。

我們考慮match[i]表示從左往右數第i個左括號所對應的是第幾個右

括號,現在他得到了乙個長度為2n的括號序列,給了你m個資訊,第i

個資訊形如ai,bi,表示match[ai]但是你發現這個豬豬俠告訴你的資訊,可能有多個括號序列合法;甚

至有可能告訴你乙個不存在合法括號序列的資訊!

你最近學了取模運算,你想知道答案對998244353(7*17*2^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

設f[l][r]表示第l個括號到第r個括號的匹配方案。

考慮l的右括號應在**,有兩種轉移:

1.(.....)型:若區間[l+1,r]中沒有任何一條諸如match[i]2.(...)...型:列舉分割位置p,類似判斷條件,轉移為f[l][r]+=f[l+1][p]*f[p+1][r]。

為了o(1)完成判斷,我們其實是在詢問乙個矩形內有沒有點,用字首和判判即可。

#include#include

#include

#include

#include

#include

#include

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

#define ren for(int i=first[x];i;i=next[i])

using

namespace

std;

inline

intread()

typedef

long

long

ll;const

int maxn=310

;const

int mod=998244353

;int

f[maxn][maxn],a[maxn][maxn];

int check(int x1,int x2,int y1,int

y2)

int dp(int l,int

r)

return

ans;

}int

main()

rep(i,

1,n) rep(j,1,n) a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1

]; printf(

"%d\n

",dp(1

,n));

}return0;

}

view code

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個左括號所對...

BZOJ4350 括號序列再戰豬豬俠 區間DP

括號序列與豬豬俠又大戰了起來。眾所周知,括號序列是乙個只有 和 組成的序列,我們稱乙個括號序列s合法,當且僅當 1.是乙個合法的括號序列。2.若a是合法的括號序列,則 a 是合法的括號序列。3.若a,b是合法的括號序列,則ab是合法的括號序列。我們考慮match i 表示從左往右數第i個左括號所對應...