codeforces ASC28J 三元環計數

2021-08-26 12:22:13 字數 1635 閱讀 3599

題面

這個題也不是很難,就是個一般的三元環計數

今天用一種奇怪的做法bi

tset

b it

se

t來優化bi

tset

b it

se

t是個很好用的東西 類似於乙個二進位制數 但是時間和空間消耗都很小

它大概有以下操作

1. 1.

所有的位運算,例如

<<

,>>,|

,⊕<<

,>>,|

,⊕

還有&運算

2. 2.

一些相關的函式

#include

#include

std::bitset

<233> f;

int main()

反正這個東西自帶乙個1ω

1

ω的常數,可以優化一些過不了的東西

64 64

位的機器上ω=

64 ω=64

這樣子n3

n

3的演算法就可以優化到o(

n3ω)

o (n

)就能跑n=

1000

n

=1000

了這個題加上bi

tset

b it

se

t的做法之後就可以直接跑最暴力的做法了

首先把每個點的出邊和入邊都用bi

tset

b it

se

t存下來

然後暴力列舉兩個點,a−

>

b a

−>

b, 把

a a

的入邊和

b' role="presentation" style="position: relative;">b

b的出邊進行與操作後裡面

1 1

的個數加入答案就夠了。

因為三元環每條邊都被列舉到了一次 最後答案除個3就好了

記得開lon

glon

g' role="presentation" style="position: relative;">lon

glon

glon

glon

g 複雜度o(n

3ω) o(n

)codes

#include

using

namespace

std;

const

int n = 1500 + 10;

bitset

in[n], out[n];

int a[n][n], ans;

int main()

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

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

if(a[i][j])

ans += (out[j] & in[i]).count();

cout

<< ans / 3

<< endl;

return

0;}

2 8 後向引用

當乙個正規表示式被分組之後,每乙個組將自動被賦予乙個組號,該組號可以代表該組的表示式。其中,組號的編制規則為 從左到右 以分組的左括號 為標誌,第乙個分組的組號為1,第二個分組的組號為2,以此類推。反向引用提供查詢重複字元組的方便的方法。它們可被認為是再次匹配同乙個字串的快捷指令。後向引用可以使用數...

(28)迭代語句

迭代語句通常稱為迴圈,它重複執行操作直到滿足某個條件才停下來。while和for語句在執行迴圈體之前檢查條件,do while語句先執行迴圈體,然後再檢查條件。只要條件為真,while語句就重複的執行迴圈體,它的語法形式是 while condition statement 定義在while條件部分...

(回溯2)8皇后

題目 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1b2 b8,其中bi為相應擺法中第i行皇后所處的列數。已經知道...