題面
這個題也不是很難,就是個一般的三元環計數
今天用一種奇怪的做法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
3ω
)就能跑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
3ω
)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行皇后所處的列數。已經知道...