OJ 1159 holiday

From easthong☆holiday
描述 Description
     经过几个月辛勤的工作,FJ决定让奶牛放假。假期可以在1…N天内任意选择一段(需要连续),每一天都有一个享受指数W。但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不能得到足够的休息;假期也不能超过Q天,否则奶牛会玩的腻烦。FJ想知道奶牛们能获得的最大享受指数。
输入格式 Input Format
     第一行:N,P,Q.
第二行:N个数字,中间用一个空格隔开。
输出格式 Output Format
     一个整数,奶牛们能获得的最大享受指数。
样例输入 Sample Input    

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

样例输出 Sample Output    

5

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

时间限制 Time Limitation
     1s
注释 Hint
     50% 1≤N≤10000
100% 1≤N≤100000
1<=p<=q<=n

本题提供两种思路

1.线段树   复杂度(nlogn)

2.单调队列 复杂度(n)

具体实现

1.线段树:

首先预处理出来sum前缀和,

对于每一点i,我们只需要找到符合题意范围内最小的即可

并放入线段树中

对去查询每一个点,用线段树去查询i-q+1~i-p+1之间的最小值

然后去更新最大值

2.单调队列:

构造一个单调队列

当枚举到i的时候,用sum[i-p+1]去更新队列

具体实现看代码

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 inline ll read(){
 5     ll x=0;int f=1;char ch=getchar();
 6     while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
 7     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
 8     return x*f;
 9 }
10 const int MAXN=1e6+10;
11 namespace zhangenming{
12     ll q[MAXN],head=1,tail=0,a[MAXN],maxn=-10000000000000,sum[MAXN]={},n,p,qq;
13     void init(){
14         n=read();p=read();qq=read();
15         for(int i=1;i<=n;i++){
16             a[i]=read();
17             sum[i]=sum[i-1]+a[i];
18             //cout<<sum[i]<<‘ ‘;
19         }
20         //cout<<endl;
21     }
22     void solve(){
23         q[++tail]=0;
24         for(int i=p;i<=n;i++){
25             while(head<=tail&&i-q[head]>qq) head++;
26             //cout<<i<<‘ ‘<<q[head]<<‘ ‘;
27             ll tn=sum[i]-sum[q[head]];
28             //cout<<tn<<endl;
29             maxn=max(maxn,tn);
30             //cout<<maxn<<endl;
31             tn=i-p+1;
32             while(sum[tn]<=sum[q[tail]]&&head<=tail) tail--;
33             q[++tail]=tn;
34         }
35         cout<<maxn<<endl;
36     }
37 }
38 int main(){
39     //freopen("ab.in","r",stdin);
40     //freopen("ab.out","w",stdout);
41     using namespace zhangenming;
42     init();
43     solve();
44     return 0;
45 }

时间: 2024-10-18 11:49:19

OJ 1159 holiday的相关文章

九度oj 题目1159:坠落的蚂蚁

题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

LeetCode OJ - Longest Consecutive Sequence

这道题中要求时间复杂度为O(n),首先我们可以知道的是,如果先对数组排序再计算其最长连续序列的时间复杂度是O(nlogn),所以不能用排序的方法.我一开始想是不是应该用动态规划来解,发现其并不符合动态规划的特征.最后采用类似于LRU_Cache中出现的数据结构(集快速查询和顺序遍历两大优点于一身)来解决问题.具体来说其数据结构是HashMap<Integer,LNode>,key是数组中的元素,所有连续的元素可以通过LNode的next指针相连起来. 总体思路是,顺序遍历输入的数组元素,对每个

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar

light oj 1236 【大数分解】

给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,--em, 则结果为((1+2*e1)*(1+2*e2)--(1+2*em)+1)/2. //light oj 1236 大数分解素因子 #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #i

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

LeetCode OJ - Subsets 1 &amp;&amp; 2

这道题的做法,一定得掌握啊!!!  elegant & beautiful & concise 下面是AC代码: 1 /** 2 * Given a set of distinct integers, S, return all possible subsets. 3 * 这道题的做法应该要记住!!!!! 4 * @param s 5 * @return 6 */ 7 public ArrayList<ArrayList<Integer>> subsets(int[

LeetCode OJ - Convert Sorted Array/List to Binary Search Tree

虚函数使用的时机 为什么虚函数不总是适用? 1. 虚函数有事会带来很大的消耗: 2. 虚函数不总是提供所需的行为: 3. 当我们不考虑继承当前类时,不必使用虚函数. 必须使用虚函数的情况: 1. 当你想删除一个表面上指向基类对象,实际却是指向派生类对象的指针,就需要虚析构函数. LeetCode OJ - Convert Sorted Array/List to Binary Search Tree,布布扣,bubuko.com LeetCode OJ - Convert Sorted Arra