Codeforces 834D - The Bakery(dp+线段树)
思路:dp[i][j]表示到第j个数为止分成i段的最大总和值。
dp[i][j]=max{dp[i-1][x]+c(x+1,j)(i-1≤x≤j-1)},c(x+1,j)表示x+1到j的不同的值。
用线段树维护一下最大值。
上图最后一个点取不到,不解释,不明白请评论。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define pb push_back
const int INF=0x3f3f3f3f;
const int N=;
int tree[*N],lazy[*N];
int dp[][N];
int now[N],pre[N],a[N];
int i; void push_up(int rt)
{
tree[rt]=max(tree[rt<<],tree[rt<<|]);
} void push_down(int rt)
{
tree[rt<<]+=lazy[rt];
lazy[rt<<]+=lazy[rt];
tree[rt<<|]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
lazy[rt]=;
} void build(int rt,int l,int r)
{
if(l==r)
{
tree[rt]=dp[i-][l];
return ;
}
int m=(l+r)>>;
build(ls);
build(rs);
push_up(rt);
} void update(int p,int delta,int rt,int l,int r)
{
if(l==r)
{
tree[rt]+=delta;
return ;
}
int m=(l+r)>>;
if(p<=m)update(p,delta,ls);
else update(p,delta,rs);
push_up(rt);
} void Update(int L,int R,int delta,int rt,int l,int r)
{
if(L<=l&&r<=R)
{
tree[rt]+=delta;
lazy[rt]+=delta;
return ;
}
if(lazy[rt])push_down(rt);
int m=(l+r)>>;
if(L<=m)Update(L,R,delta,ls);
if(R>m)Update(L,R,delta,rs);
push_up(rt);
} int query(int L,int R,int rt,int l,int r)
{
if(L<=l&&r<=R)return tree[rt];
if(lazy[rt])push_down(rt);
int m=(l+r)>>,ans=;
if(L<=m)ans=max(ans,query(L,R,ls));
if(R>m)ans=max(ans,query(L,R,rs));
return ans;
} int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
memset(now,,sizeof(now));
for(int i=;i<=n;i++)
{
cin>>a[i];
pre[i]=now[a[i]];
now[a[i]]=i;
}
dp[][]=;
for(i=;i<=k;i++)
{
memset(tree,,sizeof(tree));
memset(lazy,,sizeof(lazy));
build(,,n);
for(int j=i;j<=n;j++)
{
Update(pre[j],j-,,,,n);
dp[i][j]=query(i-,j-,,,n);
}
}
cout<<dp[k][n]<<endl;
}
return ;
}
Codeforces 834D - The Bakery(dp+线段树)的更多相关文章
- Codeforces 834D The Bakery 【线段树优化DP】*
Codeforces 834D The Bakery LINK 题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献 是第一次做线段树维护DP值的题 感觉还可以, ...
- Codeforces 834D The Bakery - 动态规划 - 线段树
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- Codeforces 833B The Bakery dp线段树
B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- Codeforces 834D The Bakery【dp+线段树维护+lazy】
D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...
随机推荐
- php hash算法
任意长度的输入, 固定长度的输出 ,该输出就是hash值,这种转换就是一种压缩映射,也就是hash值的空间远远小于输入的空间, 不同的输入可能散列成相同的输出,而不能从hash值来唯一的确定输入值. ...
- css+div table
div+css table表格样式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- 使用Jmeter测试Dubbo接口(参数设置篇)
WebSocket接口需要下载dubbo插件才能使用 本次下载的版本为jmeter-plugins-dubbo-1.3.6,下载完成后jar文件放到\lib\ext目录下 由于工作需要,最近需要对du ...
- linux服务器---代理认证
代理认证 proxy代理服务被广泛的使用,为了安全起见,可以在服务器上增加一层安全认证机制.这里使用htpasswd建立认证账号和密码 1.创建认证账号和密码 [root@localhost wj]# ...
- php 获取随机数的几个方式
php 获取随机数的几个方式 1.直接获取从min-max的数,例如1-20:$randnum = mt_rand(1, 20); 2.在一个数组里面随机选择一个(验证码的时候需要字母.数字混合的情况 ...
- python之路----钻石继承
钻石继承 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B ...
- 9大行为导致Java程序员薪资过低, 你有几个?
Java程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的Java程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?本文整理导致J ...
- Python入门之Python中的logging模块
基本用法 下面的代码展示了logging最基本的用法. import logging import sys # 获取logger实例,如果参数为空则返回root logger logger = log ...
- 20145317彭垚《网络对抗》Exp9 Web安全基础实践
20145317彭垚<网络对抗>Exp9 Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询 ...
- Android移植学习笔记
1.一头雾水不知道用什么编译环境,不知道用什么下载软件 编译软件:Ubuntu12.04(编译主机系统),JDK(Java) 下载软件: 模拟器: qemu