hdu2430 Beans 单调队列
// hdu2430 Beans 单调队列
//
// 题目意思:
// 求一个sum%p<=k的max(sum/p)
//
// 结题报告:
// 技巧,先求出前缀和,并记录前i项对p取余的值记为x,并记下位置pos
// 依照先按x从小到大。假设x同样按pos从小到大排序。 这样,问题就转换为
// 求一个最小的pos使得pos到i的值最大。
//
// 单调队列里面保持的就是对于当前的i最小的pos值(满足pos到i区间的sum是满足条件的)
// 由于数组递增,这样求得的sum一定是最大的,这样就能够了
//
// 感悟:
//
// 这题应该也能够用线段树做,做的话也是以i为端点,查找最小的pos。而这个pos在
// sum[i]%p-k,sum[i]%p之间(由于k>=(sum[i]-sum[pos])%p>0),维护最小值。 待我练练线段树
// 再加上自己更深的理解而单调队列也能实现以i为结尾的区间之前的最小的pos值,
// 感觉单调队列实在非常巧妙 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream> typedef long long ll; using namespace std;
const int MAX_N = 1e6 + 100;
struct node {
int pos;
int val;
}a[MAX_N],deq[MAX_N];
ll f[MAX_N];
int t;
int n,p,k; bool cmp(node a,node b){
if(a.val!=b.val)
return a.val < b.val;
return a.pos < b.pos;
} void input(){
cin >> n >> p >> k;
f[0] = 0;
for (int i=1;i<=n;i++){
cin >> f[i];
f[i] = f[i-1] + f[i];
a[i].val = (int)(f[i]%(ll)p);
a[i].pos = i;
} sort(a+1,a+n+1,cmp); } void solve(){
int head = 0,tail = 0;
ll mx = -1;
for (int i=1;i<=n;i++){
while(head < tail && deq[tail-1].pos >= a[i].pos)
tail--; deq[tail++] = a[i]; while(head < tail && a[i].val - deq[head].val > k)
head++; if (f[a[i].pos]%(ll)p<=k) mx = max(mx,f[a[i].pos]/p); else if (head < tail && deq[head].pos < a[i].pos){
mx = max(mx,(f[a[i].pos] - f[deq[head].pos])/p);
}
}
cout << mx << endl;
} int main(){
ios::sync_with_stdio(false);
//freopen("1.txt","r",stdin);
int t;
cin >> t;
int kase = 1;
while(t--){
input();
cout << "Case " << kase++ << ": ";
solve();
}
}
hdu2430 Beans 单调队列的更多相关文章
- HDU 2430 Beans (单调队列+公式化简)
题意:给你n袋豆子,每袋都有w[i]个豆子,接着任选连续任意个袋子的豆子合在一起放入容量为p的多个袋子里(每个袋子必须放满),问剩余的豆子数<=k时,能放满最多的袋子的个数 题解:个数与p都比较 ...
- BestCoder Round #89 B题---Fxx and game(单调队列)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945 问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路: B ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- FZU 1914 单调队列
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...
- BZOJ 1047 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...
- 【BZOJ3314】 [Usaco2013 Nov]Crowded Cows 单调队列
第一次写单调队列太垃圾... 左右各扫一遍即可. #include <iostream> #include <cstdio> #include <cstring> ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 【转】单调队列优化DP
转自 : http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
随机推荐
- 【NOIP2018】 游记
All ended? [day 0] 一点感觉没有,不过翘掉了早上的课(当然还有前三周的课),然后刚想睡一会儿,就被通知要上车了/难受 在车上玩了一会儿早上下的Super Mario(主要是早上刷了一 ...
- File入门及路径名问题
package com.io.file; import java.io.File; /** * @author 王恒 * @datetime 2017年4月20日 下午2:53:29 * @descr ...
- springMVC上传图片,json交互(三)
@RequestMapping 通过@RequestMapping注解可以定义不同的处理器映射规则. @RequestMapping(value="item")或@RequestM ...
- P1146 硬币翻转
题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻 ...
- SharedPreferences用法
SharedPreferences是Android四种数据存储技术中的一种,它是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信 息,其对 ...
- javaee字符文件的复制
package Zy; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWrit ...
- Day 22 面向对象编程
面向对象基础 面向对象编程(抽象) 对象:特征和技能的结合体 面向对象编程:一个个对象进行交互 优点:扩展性非常强 缺点:逻辑非常复杂 类与对象 类(类别):一系列具有相同特征和技能的对象 现实世界中 ...
- 【剑指Offer】1、二维数组中的查找
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...
- [tyvj1957 Poetize5] Vani和Cl2捉迷藏 (最小路径可重点覆盖+二分图最大匹配)
传送门 Description 这片树林里有N座房子,M条有向道路,组成了一张有向无环图. 树林里的树非常茂密,足以遮挡视线,但是沿着道路望去,却是视野开阔.如果从房子A沿着路走下去能够到达B,那么在 ...
- CentOS7安装Kubernetes
CentOS7安装Kubernetes 安装Kubernetes时候需要一台机器作为管理机器,1台或者多台机器作为集群中的节点. 系统信息: Hosts: 请将IP地址换成自己环境的地址. cento ...