Codeforces 990C 模擬 組合數學

2022-03-29 10:38:14 字數 2228 閱讀 1550

傳送門此題o

(n2l

)' role="presentation" style="position: relative">o(n

2l)o

(n2l

)模擬肯定是會超時的(l為所有字串總長)

我們想到對字串進行一定的預處理,可以快速計算匹配

我們設每乙個(的值為1,)的值為-1,規定

若只有)括號多了x個,則l[i]=r[i]=-x<0

若只有(括號多了x個,則l[i]=r[i]=x>0

那麼如何求l[i],r[i]的值呢?

從左到右掃瞄字串,用乙個變數cnt,統計和

cnt的最小值=l[i],最終的值=r[i]

若(和)都有多餘,則必須接兩個字串,不符合條件,所以計算時應該直接跳過這些字串,不用考慮

要理解這句話,請看下面的模擬過程

)()

字串下標(0開始) 0 1 2

cnt值 -1 0 -1

l[i]=-1,說明左邊需要乙個(括號來匹配 (>=0即不需要)

r[i]=-1,說明右邊不需要(<=0即不需要),而左邊需要乙個(括號

我們以all[i]來hash,雜湊表的第 x位儲存了所有r[i]=x的字串的l[i]

但要注意的是,由於負數的原因,陣列下標要人為加上乙個數addv來儲存

為了防止一對字串被算兩次,我們規定字串只能接在右邊,我們列舉字串時要先保證l[i]>=0才能接,而l[i]<0的只能接在其他字串右邊

對於乙個l[i]>=0的字串i,我們尋找接在它右側能匹配的字串,所以我們在雜湊表的−r

[i]' role="presentation" style="position: relative">−r[

i]−r

[i]位置尋找l[i]值為−r

[i]' role="presentation" style="position: relative">−r[

i]−r

[i]的字串

比如:()(的l[i]=0,r[i]=1,我們則要尋找r[i]=l[i]=-1,即只多了乙個)括號的字串

用二分查詢統計值為−r

[i]' role="presentation" style="position: relative">−r[

i]−r

[i]的字串的個數,答案+=值為−r

[i]' role="presentation" style="position: relative">−r[

i]−r

[i]的字串的個數

預處理時間複雜度o(

l)' role="presentation" style="position: relative">o(l

)o(l

) (l為所有字串總長)

二分查詢時間複雜度o(

nlog

2l)' role="presentation" style="position: relative">o(n

log2

l)o(

nlog

2l)

#include

#include

#include

#include

#include

#define addv 300005

#define maxn 2*addv

using

namespace

std;

int n;

char str[maxn];

int cnt;

int l[maxn];

int r[maxn];

vector

table[maxn];

int main()

r[i]=cnt;

table[r[i]+addv].push_back(l[i]);//hash,為了防止負數人為加上addv,addv就相當於新的零點

}for(int i=1;iif(table[i].size()!=0) sort(table[i].begin(),table[i].end());//排序,為了二分查詢

long

long ans=0;

for(int i=1;i<=n;i++)

}printf("%i64d\n",ans);

}

python 仿函式 C 仿函式

c 的標準庫stl裡面有6大部件,其中之一為仿函式。初始看到這一名字可能讓人摸不著頭腦 函式倒是挺容易理解,何故又起個仿函式的名字呢?本文將帶你揭開它看起來挺讓人迷惑但是實際上很簡單的面紗。仿函式,看名字就知道它肯定和函式有什麼關聯,但是也肯定和函式有什麼區別。函式主要是一塊接收輸入引數然後按照一定...

仿函式 C 中仿函式的應用

仿函式 c 中仿函式的應用 在使用仿函式的時候,主要用到以下兩種 一種是以基類std unary function派生出來的派生類 另一種是以基類std binary function派生出來的派生類。而這兩種有什麼區別呢?它們之間的區別只是第一種接收的引數個數為乙個,而第二種接收的引數的個數為兩個...

C 之仿函式

一 仿函式 仿函式說白了就是類中過載 函式運算子,就可以把類物件當成乙個函式來使用 先舉個例子 class pow int main 結果如下圖 可以看到類中過載了 就可以pow類的物件當成函式一樣來使用。一 仿函式的應用 仿函式主要應用於stl和模板,這裡舉個stl的例子 class cmp in...