傳送門
在乙個序列中選出兩個集合s
ss和t
tt,使得s
ss中的每個數異或起來等於t
tt中 的每個數與起來
設f i,
j,k=
0..2
f_fi
,j,k
=0..
2表示做到第i
ii個數,結果為j
jj的方案數,k=0
k=0k=
0表示在此之前並沒有任何操作,k=1
k=1k=
1表示已經開始與操作了,k=2
k=2k=
2表示已經開始異或操作了
因為要求與操作的數的編號要更靠後,所以我們倒序的轉移
因為當兩個數相等時它們的異或值為0
00,那麼fi,
0,2f_
fi,0,2
就說明當前與操作的結果會等於異或操作的結果,所以最後答案就在f1,
0,2f_
f1,0,2
#pragma gcc optimize(2)
%:pragma gcc optimize(3
)%:pragma gcc optimize
("ofast")%
:pragma gcc optimize
("inline"
)#include
#include
#include
#include
#include
#include
#define ll long long
#define p 1000000000
using
namespace std;
inline ll read()
while
(s>=
'0'&&s<=
'9')
return d*f;
}int x[
1005];
struct wyc_ak_ioif[2]
[1030][
3];void
add(wyc_ak_ioi &a,wyc_ak_ioi &b)
return;}
void
write
(wyc_ak_ioi a)
intmain()
}write
(f[1][
0][2
]);return0;
}
jzoj5231 序列問題 分治
n nn個數字,求 l 1n r ln min max i l r 109 7 sum n sum nmin max i in l.r 10 9 7 l 1 n r l n m in m ax i l.r 1 09 7 考慮分治,單獨在半個內的分治下去計算,考慮如何計算跨過中點的區間。有兩種情況 m...
Jzoj5431 序列操作
一開始有n個非負整數h i 1 i n 接下來會進行m次操作,第i次操作給出乙個數c i 要求你選出c i 個大於零的數並將它們減去1。問最多可以進行多少輪操作後無法操作 即沒有c i 個大於零的數 考場上腦抽認為先減小的會更優 很明顯先減大的會更優啊!考慮怎麼維護,可以用splay 然而正常人都用...
Jzoj5431 序列操作
一開始有n個非負整數h i 1 i n 接下來會進行m次操作,第i次操作給出乙個數c i 要求你選出c i 個大於零的數並將它們減去1。問最多可以進行多少輪操作後無法操作 即沒有c i 個大於零的數 考場上腦抽認為先減小的會更優 很明顯先減大的會更優啊!考慮怎麼維護,可以用splay 然而正常人都用...