codeforces833B The Bakery
题目大意:将一个长度为n的序列分为k段,使得总价值最大,一段区间的价值表示为区间内不同数字的个数
思路:
显然的dp。
先想到一个朴素的状态转移方程 $dp[i][k]=max(dp[j][k-1]+val[j+1][i])$,$0<=j<i$ $dp[i][k]$表示到第i为,截取了k段的最大价值,val表示某一段区间的价值。
这样的时间复杂度是$n*n*k$,显然是不能接受的,这里面的一个n和一个k显然是不能优化的,那我们只需要把一个n优化成logn或者线性的就可以接受了,所以想到线段树优化。
那么我们就要维护$dp[j][k-1]+val[j+1][i]$这个的最大值,要怎么维护呢,当我们扫到一个数字x,这个数字会对哪些val造成影响呢?显然是前一个x后面的区间。加一就好了。
然后每次把$dp[i][k-1]$放入线段树,用滚动数组来优化空间。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
#define fpn() freopen("simple.in","r",stdin)
#define rd read()
using namespace std;
const int maxn=;
typedef long long ll;
int n,k,dp[][maxn],x,le[maxn],pos[maxn],sum[maxn<<],lazy[maxn<<];
void pushup(int o){
sum[o]=max(sum[o<<],sum[o<<|]);
}
void pushdown(int o,int l,int r){
int mid=(l+r)>>;
if(l==r)return;
if(lazy[o]){
sum[o<<]+=lazy[o];
sum[o<<|]+=lazy[o];
lazy[o<<]+=lazy[o];
lazy[o<<|]+=lazy[o];
lazy[o]=;
}
}
void update(int o,int l,int r,int ql,int qr,int val){
if(ql<=l&&r<=qr){
sum[o]+=val;
lazy[o]+=val;
return ;
}
int mid=(l+r)>>;
pushdown(o,l,r);
if(ql<=mid)update(o<<,l,mid,ql,qr,val);
if(qr>mid)update(o<<|,mid+,r,ql,qr,val);
pushup(o);
}
int query(int o,int l,int r,int ql,int qr){ if(ql<=l&&r<=qr){
return sum[o];
}
int mid=(l+r)>>;
pushdown(o,l,r);
int res=;
if(ql<=mid)res=query(o<<,l,mid,ql,qr);
if(qr>mid)res=max(res,query(o<<|,mid+,r,ql,qr));
return res;
}
int main(){
while(cin>>n>>k)
{
for(int i=;i<=n;i++)
{
scanf("%d",&x);
le[i]=pos[x];
pos[x]=i;
}
int p=;
for(int s=;s<=k;s++,p^=)
{
clr(sum,),clr(lazy,);
for(int i=;i<=n;i++)
{
update(,,n,le[i],i-,);
dp[p][i]=query(,,n,,n);
update(,,n,i,i,dp[p^][i]);
}
} printf("%d\n",dp[p^][n]);
}
}
codeforces833B The Bakery的更多相关文章
- 2019.03.09 codeforces833B. The Bakery(线段树优化dp)
传送门 线段树优化dpdpdp入门题. 要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值.n≤35000,k≤50n\le35000,k\le50n≤35000, ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- Codeforeces 707B Bakery(BFS)
B. Bakery time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
- Codeforces Round #368 (Div. 2) B. Bakery (模拟)
Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...
- 信号量和PV操作写出Bakery算法的同步程序
面包店烹制面包及蛋糕,由n个销售员卖出.当有顾客进店购买面包或蛋糕时,应先在取号机上取号,然后等待叫号,若有销售员空闲时便叫下一号,试用信号量和PV操作写出Bakery算法的同步程序. 设计要求 1) ...
- 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 ...
- Codeforces 834D The Bakery - 动态规划 - 线段树
Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredient ...
- Codeforces Round #426 (Div. 1) B The Bakery (线段树+dp)
B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces Round #368 (Div. 2) B. Bakery 水题
B. Bakery 题目连接: http://www.codeforces.com/contest/707/problem/B Description Masha wants to open her ...
随机推荐
- linux 软链接 硬链接
查看文件sun.txt 加上参数i 是显示节点 inode [root@bogon test]# ls -li sun.txt 10006225 -rw-r--r--. 1 root root 0 ...
- oracle 通过序列实现某字段自增
-- 创建表 create table items( id int primary key, name ) not null, price int not null, detail ), pic ), ...
- Docker学习笔记_安装和使用Apache
一.准备 1.宿主机OS:Win10 64位 2.虚拟机OS:Ubuntu18.04 3.账号:docker 二.安装 1.搜索镜像 ...
- Docker学习之路(三)Docker网络详解
1. Docker的4种网络模式 我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用--net=host ...
- c语言练习 二维数组 年平均降水量 月平均降水量
#define YEARS 5#define MONTHES 12 int main(void) { const float rain[YEARS][MONTHES] = { {4.3,4.3,4.3 ...
- Apache logresolve命令
一.简介 logresolve是一个解析Apache访问日志中IP地址的后处理程序. 二.语法 logresolve [ -s filename ] [ -c ] < access_log &g ...
- 用JS实现点击TreeView根节点复选框全选
以下两种方法哪个不报错就用哪个.用法都是在TreeView标签中加入OnClick="",然后引入函数名即可 第一种方法:(摘自:http://www.cnblogs.com/fr ...
- hdu 4678 Mine
HDU 4678 把点开空地时会打开的一大片区域看成一块,题目中说到,在一盘游戏 中,一个格子不可能被翻开两次,说明任意两块空地不会包含相同的格子. 那么就可以看成一个组合游戏. 当空地旁边没连任何数 ...
- docker入门及安装
Docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).ba ...
- Capturing ASP.NET Application Startup Exceptions
It has become common practice to perform tasks during an ASP.NET applications start up process. Thes ...