Codeforces 834D The Bakery


LINK


题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献


是第一次做线段树维护DP值的题
感觉还可以,虽然看了一下这题是用线段树维护DP值

然后说思路
有一个很显然的思路是这样的:
dpi,j表示前i个数分成j段的最大贡献
dpi,j=max(dpk,j−1+calc(k+1,i))
然后我们就可以对于每一层j用线段树维护起来
然后就非常愉快地发现dp[i][p]只会从dp[i−1][p−1]之前的DP值进行转移
所以可以发现每次可以错位建立线段树

然后现在考虑怎么维护calc(k+1,i)
我们可以把一段区间的贡献拆成每个点的贡献
显然位置i的数会对左端点位置在pre[i]+1~i的所有点产生加一的贡献(因为考虑的右端点在i)
所以每次判断一下区间加区间求和就好了


 #include<bits/stdc++.h>
using namespace std;
#define N 350010
int a[N],b[N];
int dp[N][];
int las[N],pre[N];
int n,k;
namespace Segment_Tree{
#define MAXN N<<2
#define LD (t<<1)
#define RD (t<<1|1)
int maxv[MAXN],add[MAXN];
void pushup(int t){maxv[t]=max(maxv[LD],maxv[RD]);}
void pushdown(int t){
if(add[t]){
maxv[LD]+=add[t],add[LD]+=add[t];
maxv[RD]+=add[t],add[RD]+=add[t];
add[t]=;
}
}
void build(int t,int l,int r){
if(l>r)return;
add[t]=;
if(l==r){maxv[t]=a[l];return;}
int mid=(l+r)>>;
build(LD,l,mid);
build(RD,mid+,r);
pushup(t);
}
void modify(int t,int l,int r,int L,int R){
if(l>r)return;
if(L<=l&&r<=R){maxv[t]++;add[t]++;return;}
pushdown(t);
int mid=(l+r)>>;
if(R<=mid)modify(LD,l,mid,L,R);
else if(L>mid)modify(RD,mid+,r,L,R);
else{
modify(LD,l,mid,L,mid);
modify(RD,mid+,r,mid+,R);
}
pushup(t);
}
int query(int t,int l,int r,int L,int R){
if(l>r)return ;
if(L<=l&&r<=R)return maxv[t];
pushdown(t);
int mid=(l+r)>>;
int ans=;
if(R<=mid)ans=query(LD,l,mid,L,R);
else if(L>mid)ans=query(RD,mid+,r,L,R);
else ans=max(query(LD,l,mid,L,mid),query(RD,mid+,r,mid+,R));
pushup(t);
return ans;
}
};
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+n+);
int tot=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++)a[i]=lower_bound(b+,b+tot+,a[i])-b;
for(int i=;i<=n;i++)pre[i]=las[a[i]],las[a[i]]=i;
for(int i=;i<=n;i++)dp[i][]=dp[i-][]+(int)(pre[i]==);
for(int j=;j<=k;j++){
for(int i=;i<=n;i++)a[i]=dp[i-][j-];
Segment_Tree::build(,,n);
for(int i=;i<=n;i++){
Segment_Tree::modify(,,n,pre[i]+,i);
dp[i][j]=Segment_Tree::query(,,n,,i);
}
}
printf("%d",dp[n][k]);
return ;
}

Codeforces 834D The Bakery 【线段树优化DP】*的更多相关文章

  1. CodeForces 834D The Bakery(线段树优化DP)

    Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...

  2. Codeforces Round #426 (Div. 2) D. The Bakery 线段树优化DP

    D. The Bakery   Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought req ...

  3. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  4. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  5. Codeforces 1603D - Artistic Partition(莫反+线段树优化 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 学 whk 时比较无聊开了道题做做发现是道神题( 介绍一种不太一样的做法,不观察出决策单调性也可以做. 首先一个很 trivial 的 o ...

  6. CF833B The Bakery 线段树,DP

    CF833B The Bakery LG传送门 线段树优化DP. 其实这是很久以前就应该做了的一道题,由于颓废一直咕在那里,其实还是挺不错的一道题. 先考虑\(O(n^2k)\)做法:设\(f[i][ ...

  7. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  8. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  9. [AGC011F] Train Service Planning [线段树优化dp+思维]

    思路 模意义 这题真tm有意思 我上下楼梯了半天做出来的qwq 首先,考虑到每K分钟有一辆车,那么可以把所有的操作都放到模$K$意义下进行 这时,我们只需要考虑两边的两辆车就好了. 定义一些称呼: 上 ...

  10. 【bzoj3939】[Usaco2015 Feb]Cow Hopscotch 动态开点线段树优化dp

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented a varian ...

随机推荐

  1. Python基础笔记系列十:模块

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...

  2. Sql索引

    1.为什么要给表加上主键?建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行. 一个没加主键的表,并不能被称之为「表」.一个没加主键的表,它的数据无序 ...

  3. [Vue]组件——组件的data 必须是一个函数

    普通的Vue实例data是一个对象: data: { count: 0 } 组件的data是一个方法: data: function () { return { count: 0 } } 详情见官网: ...

  4. python中enumerate()函数用法

    python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...

  5. 【BZOJ1061】【NOI2008】志愿者招募

    [BZOJ1061][NOI2008]志愿者招募 题面 BZOJ 题解 我们设每类志愿者分别招募了\(B[i]\)个 那么,我们可以得到一系列的方程 \[\sum_{S[i]\leq x\leq T[ ...

  6. LeetCode 525. Contiguous Array

    525. Contiguous Array Add to List Description Submission Solutions Total Accepted: 2476 Total Submis ...

  7. 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l  查看scrapy创建爬虫文件可用的母版 Available templates: ...

  8. CentOS7 LDAP 2.4 安装配置

    软件安装 # yum -y install openldap-servers openldap-clients # systemctl start slapd # systemctl enable s ...

  9. Quartz教程五:SimpleTrigger

    原文链接 | 译文链接 | 翻译:nkcoder 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正:有兴趣 ...

  10. Matching (2)

    HALCON 10.0  II-B 3.1 Gray-Value-Based Matching 基于灰度的匹配是一个非常经典的方法,它仅适用于对象的不模糊,不缺失,灰度值不变化.适用于对象旋转转.注意 ...