bzoj2280[poi2011]plot二分+倍增+二分+最小圆覆盖

GXZlegend GXZlegend     2022-09-17     157

关键词:

题目描述

给出一系列点p_1, p_2, ... , p_n,将其分成不多余m个连续的段,第i段内求一个点q_i,使得q_i到这段内点的距离的最大值的最大值最小

输入

第一行,n m
下面n行,每行两个整数,表示p_i的x y坐标
1<=m<=n<=100000
坐标范围[-1000000,1000000] 0<p,q,r<=150,输入中至少包含一个’N’

输出

第一行,q_i到这段内点的距离的最大值的最大值的最小值
第二行,分成的段数k
下面k行,每行两个实数,表示q_k的x y坐标

All the real numbers should be printed with at most 15 digits after the decimal point. 

样例输入

7 2
2 0
0 4
4 4
4 2
8 2
11 3
14 2

样例输出

3.00000000
2
2.00000000 1.76393202
11.00000000 1.99998199


题解

二分+倍增+二分+最小圆覆盖

最大值最小,一眼二分答案。

考虑怎么判定:取前任意个点跑最小圆覆盖,直到半径大于mid为止,最后看分成段的数目是否超过m即可。

然而这样暴力跑是不行的,需要优化这个过程;同时直接再二分也是不可取的,因为二分的区间长度是满的,最坏情况下每段长度都为1,每段都需要$O(n\log n)$的时间来找,GG。

所以需要让求最小圆覆盖的点数只与每段长有关。考虑倍增,处理出第一个$j$,满足$2^j$个不满足条件。然后在$2^{j-1}$到$2^j$之间二分处理即可。这样第一部分时间复杂度为$O(len)$,第二部分时间复杂度为$O(len\log len)$,与n无关,所以可以满足时间要求。

因此总的时间复杂度为$O(n\log^2n)$,然而常数巨大。。。所以才给300s。。。

最小圆覆盖的求法参见 http://www.cnblogs.com/GXZlegend/p/7467029.html 

CQzhangyu说卡精度,然而没看出来= = 1A了

#include <cstdio>
#include <algorithm>
#define N 100010
#define eps 1e-15
using namespace std;
int n , m , id[N] , tot;
double mid , x[N] , y[N] , ansx[N] , ansy[N];
inline double squ(double x)
{
	return x * x;
}
bool check(int lp , int rp , double &vx , double &vy)
{
	int i , j , k , len = rp - lp + 1;
	double px = 0 , py = 0 , r = 0 , x1 , x2 , x3 , y1 , y2 , y3;
	for(i = lp ; i <= rp ; i ++ ) id[i - lp + 1] = i;
	random_shuffle(id + 1 , id + len + 1);
	for(i = 1 ; i <= len ; i ++ )
	{
		if(squ(px - x[id[i]]) + squ(py - y[id[i]]) > r + eps)
		{
			px = x[id[i]] , py = y[id[i]] , r = 0;
			for(j = 1 ; j < i ; j ++ )
			{
				if(squ(px - x[id[j]]) + squ(py - y[id[j]]) > r + eps)
				{
					px = (x[id[i]] + x[id[j]]) / 2 , py = (y[id[i]] + y[id[j]]) / 2 , r = (squ(x[id[i]] - x[id[j]]) + squ(y[id[i]] - y[id[j]])) / 4;
					if(r > mid * mid + eps) return 0;
					for(k = 1 ; k < j ; k ++ )
					{
						if(squ(px - x[id[k]]) + squ(py - y[id[k]]) > r + eps)
						{
							x1 = x[id[i]] , x2 = x[id[j]] , x3 = x[id[k]];
							y1 = y[id[i]] , y2 = y[id[j]] , y3 = y[id[k]];
							px = (x1 * x1 * (y2 - y3) + x2 * x2 * (y3 - y1) + x3 * x3 * (y1 - y2) - (y1 - y2) * (y2 - y3) * (y3 - y1)) / (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2;
							py = ((x1 - x2) * (x2 - x3) * (x3 - x1) - y1 * y1 * (x2 - x3) - y2 * y2 * (x3 - x1) - y3 * y3 * (x1 - x2)) / (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2;
							r = squ(px - x1) + squ(py - y1);
							if(r > mid * mid + eps) return 0;
						}
					}
				}
			}
		}
	}
	vx = px , vy = py;
	return 1;
}
bool judge()
{
	int i , len , last , l , r , mid;
	bool flag;
	double tmpx , tmpy;
	tot = 0;
	for(i = 1 ; i <= n ; i = last + 1)
	{
		if(tot == m) return 0;
		flag = 0;
		for(len = 1 ; !flag ; len <<= 1)
		{
			if(!check(i , min(i + len - 1 , n) , tmpx , tmpy))
			{
				flag = 1;
				break;
			}
			else if(i + len - 1 >= n)
			{
				tot ++ , ansx[tot] = tmpx , ansy[tot] = tmpy;
				return 1;
			}
			l = i + len;
		}
		r = min(i + len - 1 , n) , last = l - 1;
		while(l <= r)
		{
			mid = (l + r) >> 1;
			if(check(i , mid , tmpx , tmpy)) last = mid , l = mid + 1;
			else r = mid - 1;
		}
		check(i , last , tmpx , tmpy) , tot ++ , ansx[tot] = tmpx , ansy[tot] = tmpy;
	}
	return 1;
}
int main()
{
	srand(20011011);
	int i , cnt = 50;
	double l = 0 , r = 2e6;
	scanf("%d%d" , &n , &m);
	for(i = 1 ; i <= n ; i ++ ) scanf("%lf%lf" , &x[i] , &y[i]);
	while(cnt -- )
	{
		mid = (l + r) / 2;
		if(judge()) r = mid;
		else l = mid;
	}
	printf("%.15lf\n" , r);
	mid = r , judge();
	printf("%d\n" , tot);
	for(i = 1 ; i <= tot ; i ++ ) printf("%.15lf %.15lf\n" , ansx[i] , ansy[i]);
	return 0;
}

 

 

bzoj2527[poi2011]meteors

...:http://www.lydsy.com/JudgeOnline/problem.php?id=2527【题解】整体二分思想,其实就是把一坨二分拿一起处理了。。。(事实上这题暴力好像。。不需要二分?)我们定义solve(l,r,al,ar)为当前二分区间为[l,r],在这个区间的公司为id[al..ar]那... 查看详情

bzoj2527[poi2011]meteors:整体二分

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2527题意:  有n个国家和m个空间站,每个空间站都属于一个国家,一个国家可以有多个空间站,所有空间站按照顺序形成一个环,也就是说,m号空间站和1号空间站相邻。  现... 查看详情

bzoj2525[poi2011]dynamite二分+树形dp

【BZOJ2525】[Poi2011]DynamiteDescriptionByteotianCave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有的炸.药。某个点上的引线被点燃后的1单位时间内,在树上和它相邻的点的引线会被点... 查看详情

bzoj2527[poi2011]meteors整体二分+树状数组

题目描述有N个成员国。现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站。这个星球经常会下陨石雨。BIU已经预测了接下来K场陨石雨的情况。BIU的第i个成员国希望能够... 查看详情

bzoj2525:[poi2011]dynamite二分+树上贪心(代码片段)

一眼二分。然后重点是树上贪心部分长得像dp一样,设mn为子树内已炸点的最浅点,mx为子树内没有炸并且需要炸的最深点,然后转移直接从子树继承即可然后是判断当前u点是否需要炸,当mx[u]+mn[u]<=mid,当前子树可以自己消化... 查看详情

bzoj_2946_[poi2000]公共串_后缀数组+二分答案

BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案Description       给出几个由小写字母构成的单词,求它们最长的公共子串的长度。任务:l       读入单词l       查看详情

[bzoj2946][poi2000]公共串_后缀数组_二分

...,中间加上$n-1$个不同的非字符集数组隔开。紧接着我们二分答案。然后扫$ht$数组,看一下是否存在连续的大于$mid$的一段满足包含了所有串。$ht$除了有一个值之外还存了一下 查看详情

[poi2011]plot

https://szkopul.edu.pl/problemset/problem/mzrTn1kzVBOAwVYn55LUeAai/site/?key=statement既卡常又卡精度...真的A不动...下次有机会重写吧  查看详情

bzoj4724[poi2017]podzielno数学+二分

【BZOJ4724】[POI2017]PodzielnoDescriptionB进制数,每个数字i(i=0,1,...,B-1)有a[i]个。你要用这些数字组成一个最大的B进制数X(不能有前导零,不需要用完所有数字),使得X是B-1的倍数。q次询问,每次询问X在B进制下的第k位数字是什么(最低... 查看详情

bzoj2067[poi2004]szn二分+树上贪心

【BZOJ2067】[Poi2004]SZNDescriptionString-Toysjoint-stock公司需要你帮他们解决一个问题.他们想制造一个没有环的连通图模型.每个图都是由一些顶点和特定数量的边构成.每个顶点都可以连向许多的其他顶点.一个图是连通且无环的.图是由... 查看详情

bzoj2440:[中山市选2011]完全平方数二分答案+容斥原理+莫比乌斯反演

....com/JudgeOnline/problem.php?id=2440第一道莫比乌斯反演的题目。二分答案+容斥那里还是挺好想的。二分一个答案val,需要[1,val]之间存在的合法数字个数>=k即可。怎么判断呢?可以容斥,开始的时候有ans=val个,但是这里明显有些数字... 查看详情

bzoj2067[poi2004]szn——二分(代码片段)

...自己合并向上,所以ans=1+∑(1<=i<=n)(deg[i]-1)/2问题2:二分最长线段的长度,设f[x]表示自己带着的链的长度(即儿子中剩下的那一个带来的长度),判断是否满足条件即可;如果当前节点有偶数个 查看详情

bzoj3872[poi2014]antcolony树形dp+二分

【BZOJ3872】[Poi2014]AntcolonyDescription给定一棵有n个节点的树。在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁。这些蚂蚁会相继进入树中,而且要保证每一时刻每个节点最多只有一群蚂蚁。这些蚂蚁会按以下方式... 查看详情

[bzoj2527][poi2011]meteors

2527:[Poi2011]MeteorsTimeLimit:60Sec  MemoryLimit:128MBSubmit:1807  Solved:646[Submit][Status][Discuss]DescriptionByteotianInterstellarUnion(BIU)hasrecentlydiscoveredanewplanetinan 查看详情

bzoj2095[poi2010]bridges判断欧拉维护,最大流+二分(代码片段)

 [Poi2010]BridgesTimeLimit: 10Sec  MemoryLimit: 259MBSubmit: 1448  Solved: 510[Submit][Status][Discuss]DescriptionYYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连 查看详情

bzoj3524[poi2014]couriers(二分+蒙特卡罗)

 【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3524 【题目大意】  给一个长度为n的序列a。1≤a[i]≤n。  m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。  如果存在,... 查看详情

bzoj2213[poi2011]differencedp

【BZOJ2213】[Poi2011]DifferenceDescriptionAwordconsistingoflower-caselettersoftheEnglishalphabet(‘a‘-‘z‘)isgiven.Wewouldliketochooseanon-emptycontiguous(i.e.one-piece)fragmentofthewordsoastomaximisethed 查看详情

做题poi2011r1-plot——最小圆覆盖&倍增(代码片段)

...出这个最小化的最大值和方案(圆心)。(n,mleq10^5)显然要二分答案。然后,一个区间就是越长越好。首先,考虑最小圆覆盖(O(n))的随机增量法,但为了保证复杂度,我们需要能够random_shuffle。如果直接按照编号顺序添加点,时间... 查看详情