傳送門
首先翻轉乙個區間意味著可以將任意兩段不相交的區間組合,所以問題變成了選兩端不相交的區間,使得合併後區間和最大。那麼我們就處理出來區間,讓後進行轉移即可。
設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 輸出描...