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 单调队列是一种严格单调的队列,可以单调递增,也可以单调递减.队 ...
随机推荐
- epoll实现reactor模式
- Halcon学习笔记之支持向量机(一)
例程:class_overlap_svm.hdev 说明:这个例程展示了如何用一个支持向量机来给一幅二维的图像进行分类.使用二维数据的原因是因为它可以很容易地联想成为区域和图像.本例程中使用了三个互相 ...
- mybatis 传map参数
第一步在你的mapper写上: List<WeixinUserLocationList> findweixinUserLocations(@Param("params" ...
- NSLayoutConstraints加动画来改变约束
// // ViewController.m // NSLayoutAnimationDemo // // Created by ebaotong on 15/7/22. // Copyright ( ...
- bootstrap表格样式
一:表格基本格式 <table> <tr> <th>标题一</th> <th>标题二</th> </tr> < ...
- 3A课程笔记分享_StudyJams_2017
课程3A-面向对象编程(上) 概述 面向对象的思想在当今的软件开发中占据着主导地位. Java是一门完全面向对象的语言,是一种天然的分布式互联网软件的开发语言,在当今企业级应用中占据绝对领先地位,也是 ...
- Microsoft SQL Server 2005技术内幕:T-SQL查询笔记
logical operation:基于微软查询处理概念模型的逻辑操作.例如,联接运算符的physical operation属性表示联接算法(nested loops,merge ,hash)物理运 ...
- C# ref 和 out 的使用
private void button1_Click(object sender, EventArgs e) { ; ; Fun(ref a,ref b); //把a的地址和b的地址 传递过去 Mes ...
- vue-router同路由地址切换无效解决
本来还想写的,一搜就有现成的,算了: http://blog.csdn.net/peng_guan/article/details/59702699
- 面试官问你:MYSQL事务和隔离级别,该如何回答
一.事务 事务是由一组SQL语句组成的逻辑处理单元,是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚.事务具有以下4个属性,通常简称为事务 ...