cdqz2017暑假集训 0630

cdqz2017暑假集训 0630

・所有编译命令均不开启氧 2 优化・
・题目 √ 良心认证・

作为一名普通高中生在放学路上遇到了传说中高一就虐了日本国家队的YJQ并与他谈笑风生之后居然不知不觉地领悟了早已失传的读入优化黑暗技术的我难道来自异世界?! 』杯 ORZ赛

这事ao的

ようこそ

首先有n^4区间dp+预处理。这个自带1/12常数,应该可以过100。

还有30分 \(c_i\leq 10\)的可能就\(3^{|C|}\)枚举一下。

然后100就把枚举子区间改成讨论选不选最后一个点然后枚举左端点。

关于预处理想了一下,对于同一起点开个变量记录有无/最远的 r 的位置

#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define ROF(i,a,b) for(int i=a;i>=b;--i)
#define ll long long
using namespace std;
const int N = 5e3+200;
int read(){
	int x=0,pos=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
	for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
	return pos?x:-x; 
} 
int n,c[N],l[N],r[N],f[N],vis[N];
int ok[N][N];
int main(){
	n=read();
	FOR(i,1,n){
		c[i]=read();
		if(!l[c[i]]) l[c[i]]=i;
		r[c[i]]=i;
	}
	FOR(i,1,n){
		int tp=0,val=0;
		memset(vis,0,sizeof vis);
		FOR(j,i,n){
			if(!vis[c[j]]){
				if(l[c[j]]<i){
					FOR(k,j,n){
						ok[i][k]=-1; 
					} 
					break;
				}
				vis[c[j]]=1;
				val^=c[j];
				tp=max(tp,r[c[j]]);
			} 
			if(j==tp) tp=0;
			if(tp==0){
				ok[i][j]=val;
			}else ok[i][j]=-1;
		}
	}
	FOR(i,1,n){
		f[i]=f[i-1];
		FOR(j,1,i){
			if(ok[j][i]){
				f[i]=max(f[i],f[j-1]+ok[j][i]);
			}
		}
	}
	printf("%d",f[n]);
	return 0;
}

ジャパリ

鹰蛋问题

パーク

数据结构/排序

感觉这几套题是普及组啊,还是做HN省选集训吧

posted @ 2020-06-01 15:52  lcyfrog  阅读(123)  评论(0编辑  收藏  举报