夏令营

(camp.pas/c/cpp) 128MB 2s

Nano想靠刷题来增长实力,于是她从题库中找到了n道题打算在夏令营的时候全部刷掉。她计划按题号顺序一道一道刷。n道题中有DP,有贪心,有图论,也有模拟……各种各样的类型都有。夏令营有k天,她想合理安排每天的刷题量,使得每天能刷到尽量多种类型的题。设第i天刷了Ai种类型的题目,问要怎么安排,才能安排全部题都刷完,而且这k天的Ai的和最大。

输入格式

第1行为两个正整数 n和k,为题数和夏令营天数。

第2行N个数,第i个数Ci表示第i题的类型。

输出格式

仅一行一个数,表示最优方案下,这k天的Ai的和的最大值。

样例输入

8 3
7 7 8 7 7 8 1 7

样例输出

6

样例解释

第一天做前三题,第二天做第4至第6题,剩余的两题第三天做。这样安排的话每天都能做到两种类型的题,加起来为6.

这道题很容易想到O(nnk)的dpQAQ

但是正解需要线段树优化一波

操作有区间求max和区间加

区间加的范围就是当前点到他颜色出现的前一次的位置

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define LL long long
using namespace std;
const int M=45007,N=1<<17;
int read()
{
    char c;int s=0,t=1;
    while(!isdigit(c=getchar()))if(c==‘-‘)t=-1;
    do{s=s*10+c-‘0‘;}while(isdigit(c=getchar()));
    return s*t;
}
int T,n,m,c[M],cnt,L,R;
int f[M],last[M];
struct node{int v,pos;}e[M];
struct note{int h,mx;}tr[N];
bool cmp(node a,node b){return a.v<b.v;}
int max(int a,int b){return a>b?a:b;}
inline void up(int x){tr[x].mx=max(tr[x<<1].mx,tr[x<<1^1].mx);}
void build(int x,int l,int r){
    tr[x].h=0;
    if(l==r){
        tr[x].mx=f[l-1];
        return ;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1^1,mid+1,r);
    up(x);
}
void modify(int x,int l,int r){
    note&w=tr[x];
    if(L<=l&&r<=R){
        ++w.mx;
        ++w.h;
        return ;
    }
    note&lc=tr[x<<1],&rc=tr[x<<1^1];
    if(w.h){
        int a=w.h;
        lc.mx+=a;
        lc.h+=a;
        rc.mx+=a;
        rc.h+=a;
        w.h=0;
    }
    int mid=(l+r)>>1;
    if(L<=mid) modify(x<<1,l,mid);
    if(R>mid) modify(x<<1^1,mid+1,r);
    w.mx=max(lc.mx,rc.mx);
}
void push_max(int x,int l,int r){
    note&w=tr[x];
    if(w.mx<=T) return ;
    if(L<=l&&r<=R) return void(T=w.mx);
    if(w.h){
        note&lc=tr[x<<1],&rc=tr[x<<1^1];
        int a=w.h;
        lc.mx+=a;
        lc.h+=a;
        rc.mx+=a;
        rc.h+=a;
        w.h=0;
    }
    int mid=(l+r)>>1,ans=0;
    if(L<=mid) push_max(x<<1,l,mid);
    if(R>mid)  push_max(x<<1^1,mid+1,r);
}
int main()
{
    freopen("camp.in","r",stdin);
    freopen("camp.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++) e[i].v=read(),e[i].pos=i;
    sort(e+1,e+1+n,cmp);
    c[e[1].pos]=++cnt;
    for(int i=2;i<=n;i++){
        if(e[i].v!=e[i-1].v) cnt++;
        c[e[i].pos]=cnt;
    }
    for(int k=1;k<=m;k++){
        build(1,1,n);
        memset(last,0,sizeof(last));
        for(int i=1;i<=n;i++){
            L=last[c[i]]+1; R=i;
            modify(1,1,n);
            L=1; R=i;
            T=0;
            push_max(1,1,n);
            f[i]=T;
            last[c[i]]=i;
        }
    }printf("%d\n",f[n]);
    return 0;
}

时间: 2024-08-15 20:09:04

夏令营的相关文章

CSDN开源夏令营 百度数据可视化实践 ECharts(6) 期中总结

期中总结 (1)首先感谢林峰老师的辛勤指导!! 通过半个多月的培训,林峰老师讲解了ECharts总体框架和其中各个部分:图类.组件.接口.基础库的具有应用方法和应该把握的细节,并通过实际的例子熟悉和掌握各个控件.只有打牢基础才能正正的为下步的工作做好准备,熟练的属性代码的编程技巧,才能做出更好的专题. (2)第一次任务重点总结: 要求:了解ECharts特性中列举的每一项特性,并能找到实例中的例子,并且在实例中操作. 重点问题: 1)ECharts一种支持多少种图表?有多少个组件?列举出中英文名

CSDN开源夏令营 百度数据可视化实践 ECharts(2)

将ECharts引入项目中的几种详细方法讲解 (1)打好基本功 首先感谢林峰老师!给我们的悉心指导.我们之所以学习ECharts和Zrender图表组件,为了就是能够将图表应用到我们的实际情况中 来,进而让图表的战士能给我们一种更加人性化的方式呈现给用户.所有我们必须熟悉ECharts中相关组件.下面的例子都以line为例. (2)将ECharts引入项目共有三种方式 2.1)第一种方式-模块化包引入 模块化包引入模式也可以称为开发模式,是开发时最好的方法,不管是开发echarts还是用echa

CSDN开源夏令营 百度数据可视化实践 ECharts(1)

总体规划 (1)选题: 通过了解林峰老师的专题中国主要城市空气质量实况.中国经济十年时空漫游和中国人口流动大潮,涉及了人口.经济和民生等方面的内容,在这里我选择中国高考,作为我的切入点. 高考,一个永恒的话题,是一场你我都值得经历的一场无硝烟的战争.有人曾说:每个高考的孩子都背负着几代人的希望,每个高考的背后都有众多关注的眼睛.人生能有几回搏?虽然失去了许多,但终究会收获很多. (2)题目 2006-2014高考各省市报名人数及录取人数汇总专题 (3)搜集数据资料 工欲善其事,必先利其器.数据的

CSDN 夏令营程序 试题分析 (2)

题目:若需要在O(nlogn)(以2为底)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是: A.快速排序       B.堆排序            C.归并排序  D.直接插入排序 首先咱们来看一下这个表,稳定排序的有直接插入排序.冒泡排序.归并排序和基数排序. 直接插入排序: 最好的情况下:正序有序(从小到大),这样只需要比较n次,不需要移动.因此时间复杂度为O(n) 最坏的情况下:逆序有序,这样每一个元素就需要比较n次,共有n个元素,因此实际复杂度为O(n-2) 平均

南开大学软件学院夏令营(上)

2017年7月5日 今天是2017年7月5日,也是我们参加南开大学软件学院夏令营的第二天.今天早上九点钟,在中科院软件所QQ群听说软件所得夏令营名单出来,我去官网查看,果然又是意料中的没进. 上午参加了夏令营的入营典礼.院长介绍南开大学软件学院的历史以及由来.我了解到原来南开大学并不是独立院校.它跟计算机学院是联系在一起.跟国内其他985的示范性软件学院一样,软件学院的师资力量还是跟计算机学院是同一拨人.今天下午去津南小区参观的软件学院的大楼也是和计算机学院独立分开的.从张院长的讲话中,我知道了

2015山东信息学夏令营 Day4T3 生产

2015山东信息学夏令营 Day4T3 生产 [题目描述] 工厂为了生产一种复杂的产品,给各个生产部门制定了详细的生产计划.那么,就经常会有生产部门要把产品送到另一个生产部门作为原料.这是一个注重产品质量的工厂,所以每当有产品要从A部门运到B部门时,都要先从A部门送到质量检验处,检验合格后再从质量检验处运到B部门. 有些部门之间有传送带连接,厂长想知道每次将产品从一个部门运送到另一个部门最少需要多长时间. [输入格式] 第一行两个整数n.m,n表示部门数量,m表示传送带数量.出于方便,1号部门是

激情与梦想,我的CSDN开源夏令营

6月有幸参与到CSDN开源夏令营当中,加入了Ubuntu kylin的开源项目组,负责优麒麟手机助手的开发.初识Ubuntu是在两年前,那时候刚刚接触编程,总希望可以尽量多接触一些有逼格的东西. 后来花了一天时间在U盘里装了一个Ubuntu,还没开始骄傲就发现同学在电脑里装了13个操作系统,从那时候开始,我就学会了--只要折腾不死,就往死里折腾. 图 1 Ubuntu kylin 喜欢折腾是我能参与到优麒麟手机助手这个项目中的重要原因.大学三年我花了大部分的时间编程,只要接触到的东西有实战之处我

CSDN开源夏令营 百度数据可视化实践 ECharts 11 (期末总结)

致谢: CSDN开源夏令营马上就要结束了,随着ECharts专题列入百度ECharts官网,任务就算是基本完成了.再次谢谢林峰老师!回想两个月前听到CSDN要举办这个活动,第一感觉是非常棒,所有就积极看了看所有的项目,项目总体质量很棒,涉及的方面也很广,有云与大数据方面的.有前端与移动方面的.嵌入式与智能硬件方面的.其中linux方面的也很多,总之项目很丰富,也都很有挑战.CSDN是第一年举办这样的活动,虽然时间准备上有些仓促外,总体上组织的很好,在做项目的过程中CSDN的工作人员的服务态度也很

CSDN开源夏令营 百度数据可视化实践 ECharts(8)

(1)前言 首先谢谢林峰老师,继续接着第七篇提到的内容,CSS布局确实很累,感觉不好看了就的调整,总的看起来的高大上嘛,好了废话不再多说.今天主要就先讲解一个页面的内容,对于CSS布局后面讲会详细的介绍给大家. 另外我写的搭配时间轴地图扩展被ECharts采用,http://echarts.baidu.com/doc/example/map19.html (2)总体内容 专题包含有如下五块: 1)大海战全程: 实时描述大海战 2)国力对比篇: 中日战前.战后国力对比 3)装备对比篇: 海军实力全

CSDN开源夏令营 基于Compiz的switcher插件设计与实现之前期准备 git的简单使用

由于项目的代码需要上传到git上,就需要学习一下git的使用了.我初步接触了一下git,准备用此帖来记录git的学习,此帖会随着我对git了解的深入动态更新. 一.GIT的介绍 1.概述:git是一个分布式版本控制系统, 2.详情请见:http://baike.baidu.com/subview/1531489/12032478.htm 二.GIT的安装 这里就介绍一下linux平台下的安装,我使用的是Ubuntu Kylin 14.04,只需要在终端输入命令:sudo apt-get inst