JZOJ 3889 序列問題 dp

2021-09-29 13:03:26 字數 1249 閱讀 3951

傳送門

在乙個序列中選出兩個集合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 然而正常人都用...