牛客 CCA的區間 dp 補集轉移

2021-10-22 10:39:01 字數 2229 閱讀 6138

傳送門

首先翻轉乙個區間意味著可以將任意兩段不相交的區間組合,所以問題變成了選兩端不相交的區間,使得合併後區間和最大。那麼我們就處理出來區間,讓後進行轉移即可。

設d p[

i]dp[i]

dp[i

]表示i

ii的二進位制子集中的最大值,答案就是i+d

p[ix

orba

se]i+dp[i\ \ xor \ \ base]

i+dp[i

xorb

ase]

。現在問題是怎麼快速的求出來dp[

i]dp[i]

dp[i

]。我們可以從小到大遍歷一遍,讓後依次把當前數的一位二進位制為1

11的位置換成0

00,讓後對於每一位取一次最小值,即dp[

i]=m

ax(d

p[i]

,dp[

ixor

(1<

])dp[i]=max(dp[i],dp[i\ \ xor \ \ (1

[i]=

max(

dp[i

],dp

[ixo

r(1<

]),j

jj從0

00到22

2222

,這樣就可以預處理出來dp[

i]dp[i]

dp[i

]了,具體實現可以看**。

//#pragma gcc optimize(2)
#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define l (u<<1)

#define r (u<<1|1)

#define pb push_back

#define mk make_pair

#define mid (tr[u].l+tr[u].r>>1)

#define len(u) (tr[u].r-tr[u].l+1)

#define random(a,b) ((a)+rand()%((b)-(a)+1))

#define db puts("---")

using

namespace std;

//void rd_cre()

//void rd_ac()

//void rd_wa()

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

const

int n=

10000010

,mod=

1e9+

7,inf=

0x3f3f3f3f

;const

double eps=

1e-6

;int n;

int cnt[n]

,f[n]

;int a[n]

;int

main()

}int base=(1

<<23)

-1;for

(int i=

0;i<=base;i++

)int ans=0;

for(

int i=

0;i<=base;i++)if

(cnt[i]

) ans=

max(ans,i+f[i^base]);

printf

("%d\n"

,ans)

;return0;

}/**/

sue的小球 牛客(區間dp)

sue和sandy最近迷上了乙個電腦遊戲,這個遊戲的故事發在美麗神秘並且充滿刺激的大海上,sue有一支輕便小巧的小船。然而,sue的目標並不是當乙個海盜,而是要收集空中漂浮的彩蛋,sue有乙個秘密 只要她將小船劃到乙個彩蛋的正下方,然後使用秘密 便可以在瞬間收集到這個彩蛋。然而,彩蛋有乙個魅力值,這...

塗色PAINT 牛客(區間dp,基礎)

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...

牛客 被3整除的子串行(區間DP)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 題目描述 給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入描述 輸入乙個字串,由數字構成,長度小於等於50 輸出描...