holiday(假期)

    —— 一道妙题(codevs3622)

 

Description

经过几个月辛勤的工作,FJ 决定让奶牛放假。假期可以在1…N 天内任意选择一段(需要连续),每一天都有一个享受指数W。但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不能得到足够的休息;假期也不能超过Q 天,否则奶牛会玩的腻烦。FJ 想知道奶牛们能获得的最大享受指数。

 

Input(holiday.in)

第一行:N,P,Q. 
第二行:N 个数字,中间用一个空格隔开。

 

Output(holiday.out)

一个整数,奶牛们能获得的最大享受指数。

 

Sample Input

5 2 4 
-9 -4 -3 8 -6

 

Sample Output

5

 

Limitation

time:1s 
memory:65536kb 
50% 1≤N≤10000 
100% 1≤N≤100000 
1<=p<=q<=n

 

Hint

选择第3-4 天,享受指数为-3+8=5。

 

explanation

这道题需要仔细想一想,仔细想一想…… 
首先,我们想一想怎么算每个“几天内”的最大值,首先想可以暴力,枚举一次天数,再枚举一次i,时间是 O(n2),爆了。
所以我们还要想一想。 
前缀和?可以优化…… 
线段树?能考虑…… 
这几个小想法组合起来就可以了,但是好像不是很好想。 
我们可以枚举第一个休息日的编号i,我们要算从这个第i天开始,往后的P到Q天里快乐指数最大那一天快乐指数是多少,枚举过后取个max就行了。 
按这种方式算的话,如何将时间复杂度优化到最小? 
考虑前缀和和线段树。 
前缀和数组pre维护的是的快乐指数之和,线段树求的是i+P-1 ~ i+Q-1这一段区间的快乐指数前缀和最大值maxn,我们发现maxn-pre[i]就是从这个第i天开始,往后的P到Q天里快乐指数最大那一天快乐指数是多少。 
其实求最大值的部分,用st表或者其他的也行,只不过我觉得线段树更好。 
总共的复杂度就是O(nlogn)。

 

code

我没开long long,记得写的时候要开。

#include<cstdio>
#include<algorithm>
using namespace std;
int n,mxd,mnd,maxn = -0x3f3f3f3f;
int num[];
int pre[];
int tree[];
void build(int o,int l,int r)
{
if(l == r)
{
tree[o] = pre[l];
return;
}
int mid = (l + r) >> ;
build(o<<,l,mid);
build(o<<|,mid+,r);
tree[o] = max(tree[o<<],tree[o<<|]);
}
int query(int L,int R,int l,int r,int o)
{
if(L <= l && r <= R)
{
return tree[o];
}
int mid = (l+r)>>;
int maximum=;
if(L <= mid)
return query(L,R,l,mid,o<<);
else if(R > mid)
return query(L,R,mid+,r,o<<|);
else return max(query(L,R,l,mid,o<<),query(L,R,mid+,r,o<<|));
}
void dokyumento()
{
freopen("holiday.in","r",stdin);
freopen("holiday.out","w",stdout);
}
int main()
{
// dokyumento();
scanf("%d%d%d",&n,&mnd,&mxd);
for(int i=;i<=n;i++)
{
scanf("%d",&num[i]);
pre[i] = pre[i-] + num[i];
}
build(,,n);
for(int i=;i<=n;i++)
{
int ll = i + mnd - ;
if(ll > n)
break;
int rr = (i + mxd - > n ? n : i + mxd -);
maxn = max(maxn,query(ll,rr,,n,)-pre[i-]);
}
printf("%d",maxn);
return ;
}

holiday(假期)_题解的更多相关文章

  1. 【BZOJ4367】[IOI2014]holiday假期 分治+主席树

    [BZOJ4367][IOI2014]holiday假期 Description 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市, ...

  2. [IOI2014]holiday假期(分治+主席树)

    题目描述 健佳正在制定下个假期去台湾的游玩计划.在这个假期,健佳将会在城市之间奔波,并且参观这些城市的景点.在台湾共有n个城市,它们全部位于一条高速公路上.这些城市连续地编号为0到n-1.对于城市i( ...

  3. luogu P5892 [IOI2014]holiday 假期 决策单调性优化dp 主席树

    LINK:holiday 考虑第一个subtask. 容易想到n^2暴力枚举之后再暴力计算答案. 第二个subtask 暴力枚举终点可以利用主席树快速统计答案. 第三个subtask 暴力枚举两端利用 ...

  4. 【USACO 2012 Open】奶牛赛跑_题解

    奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...

  5. BZOJ4367 : [IOI2014]holiday假期

    设 $fl[i]$表示从$S$向左走,用了不超过$i$天且不回头的最大收益. $fr[i]$表示从$S$向右走,用了不超过$i$天且不回头的最大收益. $gl[i]$表示从$S$向左走,用了不超过$i ...

  6. [BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)

    4367: [IOI2014]holiday假期 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 128[Submit][Sta ...

  7. Clone Graph leetcode java(DFS and BFS 基础)

    题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...

  8. react+react-router+react-redux+nodejs+mongodb项目

    一个实际项目(OA系统)中的部分功能.这个demo中引入了数据库,数据库使用了mongodb.安装mongodb才能运行完整的功能.要看完整的项目可以移步我的github 技术栈 React v15. ...

  9. [EOJ Monthly 2018.10][C. 痛苦的 01 矩阵]

    题目链接:C. 痛苦的 01 矩阵 题目大意:原题说的很清楚了,不需要简化_(:з」∠)_ 题解:设\(r_i\)为第\(i\)行中0的个数,\(c_j\)为第\(j\)列中0的个数,\(f_{i,j ...

随机推荐

  1. 获取镜像tag

    # curl -k https://k8s.gcr.io/v2/fluentd-elasticsearch/tags/list|jq .tags % Total % Received % Xferd ...

  2. hbase 调试各种报错

    1.master is initializing 怎么都不知道怎么回事,直接从hbase 2.0 换到了 hbase 2.1 2.java.lang.ClassNotFoundException: o ...

  3. 03_java基础(一)之计算机应用知识普及

    1.计算机(Computer) 全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机.常见的形式有台式计 ...

  4. cakePHP模型内置回调函数afterFind()的使用。

    在用find获取数据后,我们要对所获取到的数据做一些处理,这时,直接在模型层覆盖cakephp内置的回调函数,使用find时会自动调用. 其中$baomings 就是find 到的 $this-> ...

  5. select字符串

    [select字符串] select通常用于选择某中的某一列.如有表Download: 通常用select选择某一列,如: 当select一个字符串时,则会返回如下值: 结论:select中传递一个字 ...

  6. Mysql 5.7 忘记root密码或重置密码的详细方法

    在Centos中安装完MySQL数据库以后,不知道密码,这可怎么办,下面给大家说一下怎么重置密码 在Centos中安装完MySQL数据库以后,不知道密码,这可怎么办,下面给大家说一下怎么重置密码 1. ...

  7. php判断文件夹是不是存在

    function MkFolder($path){   if(!is_readable($path)){     MkFolder( dirname($path) );     if(!is_file ...

  8. console报错:No mapping found for HTTP request with URI(xxx)

    console报错:No mapping found for HTTP request with URI(xxx) 报错可能原因: 1;contorl未加载成功 2;资源访问失败(所有访问全部被Dis ...

  9. Disruptor框架EventProcessor和Workpool的使用

    场景使用: 在HelloWorld的实例中,我们创建Disruptor实例,然后调用getRingBuffer方法去获取RingBuffer,其实在很多时候,我们可以直接使用RingBuffer,以及 ...

  10. 在别家网站上执行自己的js代码(谷歌浏览器)(谷歌扩展程序)

    @参考文章1  @参考文章2 日前针对一家投标网站进行了程序干预,且一定程度的干预成功,把方法给大家提取分享出来,感谢上述两篇博文 测试网站:百度https://www.baidu.com/ 测试步骤 ...