C. Present(二分 + 扫描线)
题目链接:http://codeforces.com/contest/460/problem/C
题意: n盆花,浇k次水, 每次可使花高度 + 1, 每次可浇相邻的w盆,ai 表示 i-th盆花 的高度 问:当浇完m次后,最矮的一盆花最高可以使多少?
解题思路: 二分 + 扫描线, 由于高度最高10e9 + 10e5 ,最小1, 然后在 这范围内二分搜索。
这道题主要的还是check, 怎样检查 浇完后是否能达到高度 h。 用树状数组或线段树 自然可以, 复杂度: 建树(nlogn ) + 点查询(nlogn)。 不过还有种更小巧精悍的方法: 扫描线(n)。
例如在【0,2),【1,3)范围内分别 + 1, 可以先f[0] += 1, f[2] -= 1, f[1] += 1, f[3] -= 1,f: 1,1,-1,-1, 计算结果是,从左完后加: 1, 1 +1,1+1-1,1+1-1-1.
1 /***Good Luck***/ 2 // 二分 + 扫描线 3 #define _CRT_SECURE_NO_WARNINGS 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cstring> 8 #include <string> 9 #include <algorithm> 10 #include <stack> 11 #include <map> 12 #include <queue> 13 #include <vector> 14 #include <set> 15 #include <functional> 16 #include <cmath> 17 18 #define Zero(a) memset(a, 0, sizeof(a)) 19 #define Neg(a) memset(a, -1, sizeof(a)) 20 #define All(a) a.begin(), a.end() 21 #define PB push_back 22 #define inf 0x3f3f3f3f 23 #define inf2 0x7fffffffffffffff 24 #define ll long long 25 using namespace std; 26 //#pragma comment(linker, "/STACK:102400000,102400000") 27 const int maxn = 100005; 28 int arr[maxn]; 29 int f[maxn + maxn]; 30 int n, m, w; 31 32 bool check(int mnh) { 33 Zero(f); 34 int tmpm = m; 35 for (int i = 1; i <= n; ++i) {// 扫描线 36 f[i] = f[i] + f[i - 1]; 37 int d = max(0, mnh - arr[i] - f[i]); 38 tmpm -= d; 39 f[i] += d; 40 f[i + w] -= d; 41 if (tmpm < 0) return false; 42 } 43 return true; 44 } 45 46 void solve() { 47 int l = 0, r = 1000000000 + maxn; 48 int mid; 49 while (l < r) { 50 mid = (l + r + 1) >> 1; 51 if (check(mid)) { 52 l = mid ; 53 } else { 54 r = mid - 1; 55 } 56 } 57 cout << r << endl; 58 } 59 int main() { 60 //freopen("data.out", "w", stdout); 61 //freopen("data.in", "r", stdin); 62 cin.sync_with_stdio(false); 63 cin >> n >> m >> w; 64 for (int i = 1; i <= n; ++i) 65 cin >> arr[i]; 66 solve(); 67 return 0; 68 }
转载于:https://www.cnblogs.com/yeahpeng/p/3927972.html
C. Present(二分 + 扫描线)相关推荐
- HDU 4747 Mex【线段树上二分+扫描线】
[题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]
题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...
- 扫描线+线段树简介 AcWing 248窗内的星星题解
----出自南昌理工学院ACM集训队 这周学习了线段树和扫描线的解题方法,下面由小菜鸡简介一下: 一般扫描线的题目最简单的便是扫描线裸模板(一般来说的话:数据范围小),其次的话便是进行拓展成线段树+扫 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- POJ 计算几何入门题目推荐
其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...
- 计算几何相关资料+题目推荐(不定期补充)
旋转卡壳:http://blog.csdn.net/accry/article/details/6070626 计算几何题目推荐:http://blog.csdn.net/accry/article/ ...
- 计算几何问题 java_【转载】ACM计算几何题目推荐
2107 Quoit Design 典型最近点对问题 POJ 3714 Raid 变种最近点对问题 B,最小包围圆 最小包围圆的算法是一种增量算法,期望是O(n). ZO ...
- poj计算几何题推荐
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- acm 计算几何题目集合
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
最新文章
- Delphi中的消息截获
- Security 登录认证流程详细分析 源码与图相结合
- python自动控制生产线输送线_一个关于自动化装配生产线结构组成案例,易懂干货...
- 中国电信与华为签物联网合作协议
- JS 获取浏览器窗口大小
- matlibplot 一张图画多个曲线_从一张风景照中就学会的SinGAN模型,究竟是什么神操作?| ICCV 2019最佳论文...
- 为同一个元素绑定多个不同的事件,并指向相同的事件处理函数方法
- Spring MVC学习总结(18)——SpringMVC事务Transactional注解使用总结
- java商品名称_Java统计商品信息
- Cesium源码剖析---Post Processing之物体描边(Silhouette)
- 拓端tecdat|R语言有限混合模型聚类FMM、广义线性回归模型GLM混合应用分析威士忌市场和研究专利申请、支出数据
- python通过GUI 界面搭建实现嵌套功能_搭建系统|升级基于财务数据的选股工具!从清单中剔除ST股和次新股...
- TCP报文段中的序号和确认号
- vb.net的socket编程
- 资源网站(电驴替代方案)
- 运放参数的详细解释和分析-part1-输入偏置电流和输入失调电流
- SageMath | Crypto Tool
- 山东农业大学计算机复试,山东农业大学复试录取分数线
- 好玩游戏不上学去学计算机,如果你这样学习,不如去玩游戏!
- 什么是JS面向对象?