CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表

传送门



最小值最大考虑二分答案,不难发现当最小值\(mid\)确定之后,原点到所有直线的距离一定都是\(mid\)时才是最优的,也就是说这些直线一定都是\(x^2+y^2=mid^2\)的切线。

接下来考虑一个点会被哪些切线所保护。作出这个点到圆的公切线,得到两个切点,那么在这两个切点之间的优弧上选择一个点,以它为切点的切线就可以保护当前点。也就是说能够保护一个点的切线的切点在圆上表现为一段角度的区间。可以用解析几何计算出这个角度的区间。

接下来需要在\([-\pi , \pi]\)上选择不超过\(M\)个点使得所有区间都被包含,但是区间在环上不太好做。考虑断环成链,将每个角度区间复制一份,左右端点均增加\(2\pi\),这样我们只需要在数轴上选择\(M\)个点满足按照左端点排序之后连续的\(N\)个区间都包含了至少一个点。

设某个方案中选择的数轴上最左边的点能够影响的最左的区间为\(p\)。我们枚举\(p\),然后贪心地向后选点。设\(f_p\)表示最大的\(r\)满足\([p,r)\)的所有区间有交,这个可以二分+ST表维护。那么我们选点一定会选择将\([p,f_p)\)覆盖,然后就到达了以\(r\)为最左区间的问题。那么如果\(f^M_p=f_{f_{...f_{p}}} \geq p + N\),那么当前的二分值就是合法的。

我们维护一个倍增数组\(jump_{p,x}\)表示\(f^{2^x}_p\),这样就可以在\(O(logN)\)的复杂度内check以\(p\)为链起点是否满足条件。

值得注意的一个细节是在上述转换之后,在第二步内求出的区间原本因为要在\([-\pi,\pi]\)内所以要拆成两段,但断环成链之后就不需要了。只是右端点可以不在\([-\pi , \pi]\)内,但是左端点一定要在\([-\pi , \pi]\)之内,否则可能出现连续的一段区间中包含了两个来自同一个点的区间的情况。这东西很难拍,下面有一个样例QAQ

6 3
42627 44146
-20187 70146
-37387 7977
-90009 -46598
-31234 -47643
45206 -23994

Code

原文地址:https://www.cnblogs.com/Itst/p/11624213.html

时间: 2024-08-02 08:42:08

CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表的相关文章

【二分+贪心+倍增】【NOIP2012】疫情控制

Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境城市的每一条路径上都至少有一个检查点,边境城市也可以建立检查点.但特别要注意的是,首都是不能建立检查点的. 现在,在H国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队.一支军队可以在有道路连接的城市间移动,并在除

poj3264Balanced Lineup(倍增ST表)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 52328   Accepted: 24551 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

poj 3264 倍增 ST表

#include<iostream> #include<cmath> using namespace std; const int maxn=1e5+10; int a[maxn]; int st[maxn][50]; int ST[maxn][50]; int quick(int a,int n) { int ans=1; while(n) { if(n&1) ans*=a; a=a*a; n>>1; } return ans; } int main() {

Hdu 5289-Assignment 贪心,ST表

题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3175    Accepted Submission(s): 1457 Problem Description Tom owns a company and he i

【CSP膜你赛】柠檬的密码(manacher 二分 单调性 st表)

题目描述 Lemon觉得他需要一个复杂的密码来保证他的帐号的安全.他经过多日思考,决定使用一个长度为奇数的回文串来作为他的密码.  但是这个回文串太长了,Lemon记不住,于是Lemon决定把它记在本子上.当然直接把密码明文记录实在太愚蠢了,于是Lemon决定在记录时加入一些无意义的字符以保证密码的安全.  具体来说,假设Lemon的密码串是S,Lemon选择了一个不超过len(S)/2的正整数x,然后把S的前x个字符组成的字符串设为Left,把S的后x个字符组成的字符串设为Right,把S其余

二分+贪心

上海邀请赛热身时候,C题是一个二分+贪心的题目.起初并不会,问了旁边的复旦大神.这几天无意发现VJ上一个专题.擦原来是一个经典类型. 二分+贪心 这类题目注意数据范围,1e8,1e9一般都是这样. 注意事项 二分法有很多写法,推荐用lf+1 < rf的写法.这个也符合计算机中数据存取的原则.对于浮点数,直接就循环100次,精度绝对够. 一般有两种类型,一种是询问最优,即数列中无重复.一种是多个即lower_bound ,upper_bound这类函数问题. 贪心使用,就是这个问题枚举答案可被验证

nyoj586||poj2456 二分+贪心

完全看不懂题意....百度搜搜才看懂题意  然后就参考代码了 和yougth的最大化()nyoj914差不多的方法 二分+贪心 #include <stdio.h> #include <algorithm> using namespace std; int c,a[100005],n; bool judge(int k) { int p=a[0],cnt=1;//也就这里注意点 从1开始 自己想想为啥 for(int i=1;i<n;i++) { if(a[i]-p>=

HDU 4004 The Frog&#39;s Games 二分 贪心

戳这里:HDU 4004 //思路:二分经典入门题...贪心判方案是否可行 1 #include "bits/stdc++.h" 2 using namespace std; 3 int L, n, m; 4 int pos[500010], dis[500010]; 5 6 bool Cant(int Dis_Jump) 7 { 8 int i, Dis_Sum = 0, Count = 0; 9 for(i = 1; i <= n + 1; ++i) { 10 if(dis[

贪心(bnuoj49103+二分+贪心)

贪心 小明喜欢养小鸡,小鸡喜欢吃小米.小明很贪心,希望养s只不同种类的小鸡,小鸡也很贪心,每天除了吃固定的ai粒小米外,还想多吃bi*s粒小米. 小明每天有M(0<=M<=10^9)粒小米可以喂小鸡,小鸡共有N(0<=N<=1000)种.问小明最多可以养多少只小鸡? Input 多组数据,请读到文件尾 第一行,整数N,M,以空格分隔,之后两行,第一行为N个整数ai,第二行为N个整数bi. ai.bi都在int范围内 Output 一行一个整数,s. Sample Input 2 4