Vladik and Memorable Trip CodeForces

来源:互联网 发布:程序化交易策略源码 编辑:程序博客网 时间:2024/06/05 08:51

传送门:CodeForces - 811C

题意:给定N个数,将它们划分成任意多个区间,要求:相同的数要么在同一个区间内,要么不在任何区间内。问区间异或和最大是多少。

思路:可以预处理出区间异或值来,也可以动态求,然后dp求一个最大值。

代码:

#include<bits/stdc++.h>#define ll long long#define fi first#define se second#define pi acos(-1)#define inf 0x3f3f3f3f#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define rep(i,x,n) for(int i=x;i<n;i++)#define per(i,n,x) for(int i=n;i>=x;i--)using namespace std;typedef pair<int,int>P;const int MAXN=5010;int gcd(int a,int b){return b?gcd(b,a%b):a;}int dp[MAXN];bool book[MAXN];int l[MAXN],r[MAXN],a[MAXN];int main(){std::ios::sync_with_stdio(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(!l[a[i]])l[a[i]]=i;r[a[i]]=max(r[a[i]],i);}for(int i=1;i<=n;i++){dp[i]=dp[i-1];int tmp=0,L=i;memset(book,0,sizeof(book));for(int j=i;j>0;j--){if(r[a[j]]>i)break;if(!book[a[j]]){book[a[j]]=1;tmp^=a[j];L=min(l[a[j]],L);}if(j<=L)dp[i]=max(dp[i],dp[j-1]+tmp);}}cout<<dp[n]; return 0;}
注意相同的数要在同一个区间。

原创粉丝点击