LOJ2392 JOISC2017 烟花棒 二分、贪心
传送门
先二分一个最大速度\(v\)。
分析移动的性质。很显然的事情是在火焰两边的所有人都会往火焰的方向以最快的速度运动,这样可以使当前位置更早获得火焰,同时当前拥有火焰的若干个人为了传递火焰自然也会以最快的速度移动。
接下来考虑某个没有火的人碰上了有火的人之后决策如何。假设有火的人\(A\)碰上了无火的人\(B\),如果\(A,B\)接下来要去的方向是一致的,那么肯定一起走直到\(A\)灭了再点燃\(B\);否则可以发现在碰上的瞬间点火和先\(AB\)一起走直到\(A\)无火时给\(B\)点火,这两种方案\(B\)能够点到火对应的相对距离范围是一致的。
所以我们可以认为\(AB\)相遇则一定会在一起跑,相当于给火焰增加了\(Tsec\)的燃烧时间,也就是说在任何时刻只会有最多一个位置有火。
那么我们实际需要做的决策就是在两个方向中选择一个方向让火往这边跑,将第一个相遇的位置加入火焰,再去做决策。不难发现在上述论述下,火焰向一边跑了之后到另一边所有人的相对距离不变,所以对于每一个人,如果火焰下一次选择它,那么消耗的时间是固定的,能够获得的时间也是固定的。我们把这两个值称为其权值,记为\((a_i,b_i)\)。
接下来的决策过程:从火焰的左边和右边找到第一个位置满足当火焰和这个位置相遇时时间相比开始增加。如果火焰可以往其中一个方向走到达这样的位置那么就走然后继续这个过程,否则肯定无解。
接下来到了走两边都一定让时间减少的部分,这里不能直接选择减的最少的位置走,因为这样的走法可能会影响决策集合从而导致无解。考虑一个常见的贪心Trick:我们已知过程结束时火焰的时间,那么我们倒着考虑,相当于把火焰左右的两个部分分别\(reverse\),\((a_i,b_i)\)交换然后做上述过程。这样不难证明从火焰左边的任何位置到最左端的位置一定能够获得正时间,右边同理。这样我们就可以通过这个问题是否有解得到整个问题是否有解了。
关于最后的Trick可以参考BZOJ3709
#include<bits/stdc++.h>
using namespace std;int read(){int a = 0; char c = getchar(); while(!isdigit(c)) c = getchar();while(isdigit(c)){a = a * 10 + c - 48; c = getchar();} return a;
}#define int long long
#define eps 1e-10
#define PII pair < int , int >
const int _ = 1e5 + 7;
int X[_] , N , K , T;bool check(int sum , vector < PII > &A , vector < PII > &B){int pos1 = 0 , pos2 = 0; if(sum < 0) return 0;while(pos1 < A.size() || pos2 < B.size())if(pos1 < A.size() && sum + A[pos1].first >= 0) sum += A[pos1++].second;else if(pos2 < B.size() && sum + B[pos2].first >= 0) sum += B[pos2++].second;else return 0;return 1;
}#define dis(a , b) ((X[a] - X[b]) / 2)bool check1(int l1 , int r1 , int mid){vector < PII > P , Q; int l = 0 , r = N + 1;while(l < l1){int pl = l , mn = 1e18;while(pl != l1){++pl; mn = min(mn , dis(pl , l + 1) - (pl - l) * T * mid);if(dis(pl + 1 , l + 1) - (pl - l) * T * mid >= 0) break;}P.push_back(PII(mn , dis(pl + 1 , l + 1) - (pl - l) * T * mid)); l = pl;}while(r > r1){int pr = r , mn = 1e18;while(pr != r1){--pr; mn = min(mn , dis(r - 1 , pr) - (r - pr) * T * mid);if(dis(r - 1 , pr - 1) - (r - pr) * T * mid >= 0) break;}Q.push_back(PII(mn , dis(r - 1 , pr - 1) - (r - pr) * T * mid)); r = pr;}return check(T * mid * N - dis(N , 1) , P , Q);
}bool check(int mid){int l = K , r = K; vector < PII > P , Q;while(l != 1){int pl = l , mn = 1e18;while(pl != 1){mn = min(mn , (l - pl) * T * mid - dis(l , pl - 1));--pl; if(dis(l , pl) <= (l - pl) * T * mid) break;}if(dis(l , pl) <= (l - pl) * T * mid) P.push_back(PII(mn , (l - pl) * T * mid - dis(l , pl)));else break;l = pl;}while(r != N){int pr = r , mn = 1e18;while(pr != N){mn = min(mn , (pr - r) * T * mid - dis(pr + 1 , r));++pr; if(dis(pr , r) <= (pr - r) * T * mid) break;}if(dis(pr , r) <= (pr - r) * T * mid) Q.push_back(PII(mn , (pr - r) * T * mid - dis(pr , r)));else break;r = pr;}return check(T * mid , P , Q) && check1(l - 1 , r + 1 , mid);
}signed main(){N = read(); K = read(); T = read() * 2; for(int i = 1 ; i <= N ; ++i) X[i] = read() * 2;int L = 0 , R = 2e9 / T + 1;while(L < R){int mid = (L + R) >> 1;check(mid) ? R = mid : L = mid + 1;} cout << L; return 0;
}
转载于:https://www.cnblogs.com/Itst/p/11553017.html
LOJ2392 JOISC2017 烟花棒 二分、贪心相关推荐
- 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)
CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...
- 洛谷P1182 数列分段 Section II(二分+贪心)
题目描述 对于给定的一个长度为N的正整数数列 A1∼NA _{1∼N}A1∼N,现要将其分成 M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一 ...
- [USACO16JAN]Angry Cows S[二分+贪心]
题意:Bessie 设计了一款新游戏:Angry Cows.在这个游戏中,玩家发射奶牛,每头奶牛落地时引爆一定范围内的干草.游戏的目标是使用一组奶牛引爆所有干草. N 捆干草排列在数轴上的不同位置.第 ...
- BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】
题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...
- hdu5248序列变换(二分+贪心)基础题
题意(中文的直接粘题意吧) ...
- 外卖(food) 洛谷4040宅男计划 三分套二分贪心
food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久. 外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 S ...
- LA 4254 Processor 处理器 【二分 贪心 优先队列】
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21663 二分: 最大值最小的问题通过二分来求解.对处理器速度进行 ...
- hdu 5248(二分+贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5248 解题思路:这道题我原本的思路是动态规划,结果看到数很大,结果放弃了.然后想到二分,思路是对的,只 ...
- poj3111 选取物品(二分+贪心)
题目传送门 题意就是,n个物品,从中选取k个,要按照那个公式所取的值最大. 思路:最大化平均值的时候首先想到的就是二分, 我们设G(x) 为单位的重量不小于X, 我们的目标就是要找到满足条件的最大的X ...
- CodeForces - 551C GukiZ hates Boxes(二分+贪心)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,表示每个位置的障碍物数量,现在有 m 个学生可以来搬走障碍物,每一秒钟可以做出的行为如下: 从位置 i 移动到位置 i + 1 从当前位置 ...
最新文章
- CentOS 6.4下PXE+Kickstart无人值守安装操作系统
- jenkins关闭,重启几种方式
- 网易 for linux,NetEaseMusic
- 名词解释说明用英语怎么说_“用英语怎么说”译成How to say in English,典型的中式英语!...
- OpenGL ES 3.0 基础知识
- 重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源
- loop和[bx]的联合应用
- LSTM+MDN【混合密度网络】---sketch rnn
- 再来关注一哥们的博客 水木 风雪
- 【Vue实战】汽车品牌列表表格实现(添加、删除功能)
- 怎么安装服务器打印组件,Windows Server2012 配置打印服务器图文教程
- 美国成功企业竞争情报案例分析
- qt开发资料下载网址
- 六大云计算厂商南山论剑,收下这封英雄帖!
- 快排三种基本解法以及两种快排优化
- HTML.网页程序设计
- outlook 无法打开
- 三国志英杰传高级玩法
- 不走寻常路的Logitech G120
- 无线信道是什么意思,无线网络通道是什么意思?
热门文章
- 序列标注模型结果评估模块seqeval学习使用
- linux闹钟命令,Linux基础命令一
- return、break、continue三者的区别
- docker 监控容器的cpu、内存、网络、io情况
- 容器镜像相关项目 错误 分析步骤
- linux 6.4 nfs配置,RHEL6.4 NFS文件共享服务器搭建
- python判断是否为素数的函数 是返回字符串yes_编写函数,判断一个数字是否为素数,是则返回字符串 YES ,否则返回字符串 NO 。_学小易找答案...
- 设计模式之GOF23原型模式02
- Spring框架工作原理
- 焦仲卿刺杀孙策_惊闻:孙伯符死于焦仲卿之手。。。