题目大意:给你一个序列(n<=35000),最多分不大于m块(m<=50),求每个块内不同元素的数量之和的最大值

考试的时候第一眼建图,没建出来,第二眼贪心 ,被自己hack掉了,又随手写了个dp方程,感觉可以用splay维护,发现有区间操作并可取,又发现这个方程只能用线段树维护,然后只剩40min了我没调完,而且线段树打错了......

定义f[i][j]表示以第i个数为这个块的结尾,已经分了j块的答案的最大值

很明显,sum表示不同元素数量

对于每个元素,记录一个表示数 i 上一次出现的位置,那么遍历到i的时候,能更新sum的位置只有到i-1,线段树维护区间修改!

而最大,线段树维护区间最大值!

算好空间,建立M颗线段树即可

 #include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define ull unsigned long long
#define il inline
#define mod 905229641
#define N 35100
#define M 52
#define il inline
using namespace std;
//re
int n,m;
int a[N],lst[N];
int f[N][M];
struct Seg{
int ma[N<<],tag[N<<];
il void pushup(int rt){ma[rt]=max(ma[rt<<],ma[rt<<|]);}
il void pushdown(int rt){
if(tag[rt])
ma[rt<<]+=tag[rt],ma[rt<<|]+=tag[rt],
tag[rt<<]+=tag[rt],tag[rt<<|]+=tag[rt],tag[rt]=;}
void update(int L,int R,int l,int r,int rt,int w)
{
if(L>R) return;
if(L<=l&&r<=R){ma[rt]+=w;tag[rt]+=w;return;}
pushdown(rt);
int mid=(l+r)>>;
if(L<=mid) update(L,R,l,mid,rt<<,w);
if(R>mid) update(L,R,mid+,r,rt<<|,w);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L>R) return ;
if(L<=l&&r<=R) {return ma[rt];}
pushdown(rt);
int mid=(l+r)>>,ans=;
if(L<=mid) ans=max(query(L,R,l,mid,rt<<),ans);
if(R>mid) ans=max(query(L,R,mid+,r,rt<<|),ans);
pushup(rt);
return ans;
}
}s[M];
int main()
{
freopen("handsome.in","r",stdin);
freopen("handsome.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
s[j-].update(lst[a[i]],i-,,n,,),
f[i][j]=s[j-].query(,i-,,n,),
s[j].update(i,i,,n,,f[i][j]);
lst[a[i]]=i;
}
int ans=;
for(int i=;i<=m;i++)
ans=max(ans,f[n][i]);
printf("%d\n",ans);
return ;
}

最新文章

  1. 微信小程序 教程之引用
  2. Moon.Orm 5.0 (MQL版) 驱动开发方案
  3. SignalR入门之小试身手
  4. Longest Common Substring
  5. UVALive 6449 IQ Test --高斯消元?
  6. JavaScript基础---语言基础(2)
  7. Properties类一些常用的用法
  8. c#_delegate_异步调用_BeginInvoke
  9. spring源码_下载以及转入eclipse (2016-11-08)
  10. require.js优化器
  11. top -bcn -1
  12. python 多层装饰器
  13. Ubuntu14.0.4 64位安装ADT问题
  14. Android-管理Activity生命周期
  15. Forms身份验证和基于Role的权限验证
  16. nginx下的几种包管理器
  17. R语言仪表盘
  18. 创建一个vue项目()
  19. 使用 SharpZipLib 打包数据到 ZIP 文件
  20. sudo执行命令允许教程

热门文章

  1. HDU 5901 Count primes( Meisell-Lehmer算法模板 )
  2. 中国电信线CTF线下选拨writeup
  3. Vue.js 渲染简写样式存在的问题
  4. redis_1 安装和简单使用
  5. BA--空调静压箱的作用
  6. Unity3D:实现人物转向与移动
  7. codecombat之KithGard地牢19-37关代码分享
  8. 火狐浏览器中加入httprequest的方法
  9. 【Cocos2d-x】坐标系和图层
  10. 受 SQLite 多年青睐,C 语言到底好在哪儿?