互测题T3...

首先有个dp是非常好想的:

设dp[i][j]为前j个数分成i组的最大得分,则易得:dp[i][j]=max{dp[i-1][k-1]+num[k][j]},其中,num[k][j]表示从第k个数到第j个数不同值的数量

而num数组可以预处理出来,时间复杂度O(n^2 k)

等等,这样好像过不掉这道题啊

我们发现,max{dp[i-1][k-1]+num[k][j]}这个东西是不是应该用什么维护一下?

线段树!

利用线段树,我们可以实现区间求最值!

我们记录一个位置i上的数a[i]上一次出现的位置为las[i],那么当我们更新dp到位置i时,我们就可以进行转移,而如果一共分了k组,则最后这一组的起点一定在k以后!

同时,利用las[i],我们可以将las[i]+1~i这一整段区间的值全部+1,因为这一段区间在更新dp时不产生重复

最后我们在k~i这段区间上做区间查询,求最大值即为dp值

每次更新完一组的dp值以后,都需要重新建树,类似滚动数组的原理

还有,在建树时,考虑到转移方程中需要用到的是dp[i-1][k-1],所以在建树时赋值的下标都应当-1以便利用

代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define rt1 rt<<1
#define rt2 (rt<<1)|1
#define ls tree[rt].lson
#define rs tree[rt].rson
using namespace std;
struct Tree
{
int lson;
int rson;
int maxval;
int lazy;
}tree[];
int dp[][];
int las[];
int p[];
int n,k;
void buildtree(int l,int r,int rt,int typ)
{
ls=l;
rs=r;
tree[rt].lazy=;
if(l==r)
{
tree[rt].maxval=dp[typ][l-];
return;
}
int mid=(l+r)>>;
buildtree(l,mid,rt1,typ);
buildtree(mid+,r,rt2,typ);
tree[rt].maxval=max(tree[rt1].maxval,tree[rt2].maxval);
}
void pushdown(int rt)
{
int t=tree[rt].lazy;
tree[rt].lazy=;
tree[rt1].lazy+=t;
tree[rt2].lazy+=t;
tree[rt1].maxval+=t;
tree[rt2].maxval+=t;
}
void ins(int l,int r,int v,int rt)
{
if(ls>r||rs<l)
{
return;
}
if(ls>=l&&rs<=r)
{
tree[rt].lazy+=v;
tree[rt].maxval+=v;
return;
}
pushdown(rt);
int mid=(ls+rs)>>;
if(l<=mid)
{
ins(l,r,v,rt1);
}
if(r>mid)
{
ins(l,r,v,rt2);
}
tree[rt].maxval=max(tree[rt1].maxval,tree[rt2].maxval);
}
int query(int l,int r,int rt)
{
if(l>rs||r<ls)
{
return ;
}
if(l<=ls&&r>=rs)
{
return tree[rt].maxval;
}
pushdown(rt);
return max(query(l,r,rt1),query(l,r,rt2));
}
int main()
{
// freopen("handsome.in","r",stdin);
// freopen("handsome.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
las[i]=p[x];
p[x]=i;
}
buildtree(,n,,);
for(int i=;i<=k;i++)
{
for(int j=;j<=n;j++)
{
int lq=las[j];
ins(lq+,j,,);
dp[i][j]=query(i,j,);
}
buildtree(,n,,i);
}
printf("%d\n",dp[k][n]);
return ;
}

CF 833B的更多相关文章

  1. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  2. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  3. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  4. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  5. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  6. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  7. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  8. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  9. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

随机推荐

  1. 已安装nginx支持https配置 the "ssl" parameter requires ngx_http_ssl_module

    原文链接:https://blog.seosiwei.com/detail/28 nginx已安装,ssl模块未安装的解决方法: 如果需要在linux中编译自己的nginx服务器,请参照:https: ...

  2. 【Math for ML】向量微积分(Vector Calculus)

    I. 向量梯度 假设有一个映射函数为\(f:R^n→R^m\)和一个向量\(x=[x_1,...,x_n]^T∈R^n\),那么对应的函数值的向量为\(f(x)=[f_1(x),...,f_m(x)] ...

  3. python3+selenium入门11-窗口切换

    在打开新的浏览器窗口时,如果要定位新窗口的元素,需要先切换到这个新打开的窗口中,才能定位到该窗口下的元素. current_window_handle:获取当前句柄.可以把句柄理解成窗口的身份证 wi ...

  4. 题解-bzoj4320 Homework

    Problem bzoj4320 Solution 前置技能:分块+线段树+卡常+一点小小的数学知识 考试时A的 这种题无论怎么处理总有瓶颈,套路分块,设\(k\)以下的插入时直接暴力预处理,查询时直 ...

  5. [nodejs]er_bad_field_error NaN in where clause

    1 前言 nodejs 运行时,出现以下情况er_bad_field_error NaN in where clause. 2 分析 原来是userid = NAN传进来了,生成userid时出错了. ...

  6. Codeforces 446C DZY Loves Fibonacci Numbers [线段树,数论]

    洛谷 Codeforces 思路 这题知道结论就是水题,不知道就是神仙题-- 斐波那契数有这样一个性质:\(f_{n+m}=f_{n+1}f_m+f_{n}f_{m-1}\). 至于怎么证明嘛-- 即 ...

  7. 【进阶1-3期】JavaScript深入之内存空间详细图解(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/x4ZOYysb9XdT1grJbBMVkg 今天介绍的是JS内存空间,了解内存空间中的堆和 ...

  8. 小程序---textarea踩坑

    1.小程序中textarea不能在scroll-view.swiper.picker-view等等里面运用. 2.不在fixed布局的页面中,placeholder也会随着页面滚动,解决方法:顶级父元 ...

  9. vue -webpack.dev.config.js模拟后台数据接口

    在const portfinder = require('portfinder')后面添加 const express = require('express') const app = express ...

  10. a href=#与 a href=javascript:void(0) 的区别(转)

    a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="javascript:void(0)" onCl ...