例三炸
  • 板块CF833B The Bakery
  • 楼主kind_Ygg
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/14 11:34
  • 上次更新2024/10/14 16:48:04
查看原帖
例三炸
926886
kind_Ygg楼主2024/10/14 11:34
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=35005;
const int K=55;
int ls(int x){return x<<1;}
int rs(int x){return x*2+1;}
int n,k;
int a[N];
int in[N],s[N];
int tree[N],tag[N];
int dp[N][K];
void build(int p,int s,int t,int lst)
{
	if(s==t)
	{ 
		tree[p]=dp[s][lst];
		return;
	}
	int mid=s+((t-s)>>1);
	build(ls(p),s,mid,lst);
	build(rs(p),mid+1,t,lst);
	tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void push_down(int p)
{
	if(tag[p])
	{
		tree[ls(p)]+=tag[p];
		tree[rs(p)]+=tag[p];
		tag[ls(p)]+=tag[p];
		tag[rs(p)]+=tag[p];
		tag[p]=0;
	}
	return;
}
void update(int l,int r,int k,int s,int t,int p)
{
	if(l<=s and t<=r)
	{
		tree[p]+=k;
		tag[p]+=k;
		return;
	}
	int mid=s+((t-s)>>1);
	push_down(p);
	if(l<=mid) update(l,r,k,s,mid,ls(p));
	if(mid+1<=r) update(l,r,k,mid+1,t,rs(p));
	tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
int query(int l,int r,int s,int t,int p)
{
	if(l<=s and t<=r) return tree[p];
	int mid=s+((t-s)>>1);
	push_down(p);
	int maxn=-1;
	if(l<=mid) maxn=max(maxn,query(l,r,s,mid,ls(p)));
	if(mid+1<=r) maxn=max(maxn,query(l,r,mid+1,t,rs(p)));
	return maxn;
}
signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		in[i]=s[a[i]]+1;
		s[a[i]]=i;
//		cout<<in[i]<<' ';
	}
	for(int i=1;i<=k;i++)
	{
		memset(tag,0,sizeof tag);
		build(1,1,n,i-1);
		for(int j=i;j<=n;j++)
		{
			update(in[j],j,1,1,n,1);
			dp[j][i]=query(1,j,1,n,1);
		}
		cout<<'\n';
	}
	cout<<dp[n][k]<<'\n';
	return 0;
}
2024/10/14 11:34
加载中...