CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!) E. Another MEX Problem(区间dp mex性质)

题目

给出一个n(n<=5e3)的序列,第i个数ai(0<=ai<=n)

你可以在序列里选出若干个不相交的子数组,

对每个子数组求MEX,再将得到的若干个MEX值异或起来,得到ans

现在想让ans最大,输出最大的ans

实际t(t<=5e3)组样例,保证sumn不超过5e3

思路来源

luanmenglei代码

题解

一个n*n的区间,mex总共只会增大n次,找到这个性质之后就是暴力了

数不是连续的mex区间数<=数是连续的mex区间数

<=数是顺序或逆序的mex区间数<=数是两段接在一起的mex区间数

最后一种情况是形如0 1 0或者1 0 1的区间,而这种情况也是线性的,所以都是线性的

mex[i][j]表示[i,j]的mex值,

pos[i][j]表示只考虑<=i的值时,异或出j这个值时,最小的右端点的位置,

可以通过增序遍历把第一维滚掉

只有mex[l][r]不等于mex[l][r-1],且mex[l][r]不等于mex[l+1][r]时,才需要转移

代码

//#include
#include
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<

你可能感兴趣的:(#,区间dp,区间dp)