恩。。这题真是sxbk

我们先二分答案,然后判断答案是否满足要求

判断方法是二分当前段的长度一直做到底,当然我们可以用倍增这样快一点,直接随机增量就可以了

然后就是卡常。。。。。

然后就是卡精度QAQQQQQQQ没了

 /**************************************************************
Problem: 2280
User: rausen
Language: C++
Result: Accepted
Time:90955 ms
Memory:7068 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <algorithm> using namespace std;
typedef double lf;
typedef long double LF;
const int N = 1e5 + ;
const LF eps = 1e-;
const LF EPS = 1e-;
const LF inf = 1e8; inline int read();
inline void print(const lf&); template <class T> inline T sqr(const T &x) {
return x * x;
} struct point {
lf x, y;
point() {}
point(lf _x, lf _y) : x(_x), y(_y) {} friend inline point operator + (const point &p, const point &q) {
return point(p.x + q.x, p.y + q.y);
}
friend inline point operator - (const point &p, const point &q) {
return point(p.x - q.x, p.y - q.y);
}
friend inline LF operator * (const point &p, const point &q) {
return p.x * q.y - p.y * q.x;
}
friend inline point operator / (const point &p, const LF &d) {
return point(p.x / d, p.y / d);
} inline void read_in() {
x = read(), y = read();
}
inline void print_out() {
print(x), putchar(' '), print(y), putchar('\n');
}
friend inline LF dis2(const point &p) {
return sqr((LF) p.x) + sqr((LF) p.y);
}
friend inline lf dis(const point &p) {
return sqrt(dis2(p));
}
friend inline point work(const point &a, const point &b, const point &c) {
point p = b - a, q = c - a, res;
LF d = p * q * ;
if (fabs(d) < EPS) {
lf ab = dis2(b - a), bc = dis2(c - b), ac = dis2(c - a);
if (ab - bc >= EPS && ab - ac >= EPS) return (a + b) / ;
if (bc - ab >= EPS && bc - ac >= EPS) return (b + c) / ;
return (a + c) / ;
}
return point(dis2(p) * q.y - dis2(q) * p.y, dis2(q) * p.x - dis2(p) * q.x) / d + a;
}
} p[N], q[N], c[N], ans[N]; int n, m, cnt;
LF rad, now_ans; inline void min_cover(const int &L, const int &st, const int &R) {
static int i, j, k;
for (i = st; i <= R; ++i) if (dis2(q[i] - c[cnt]) > rad) {
c[cnt] = q[i], rad = 0.0;
for (j = L; j < i; ++j) if (dis2(q[j] - c[cnt]) > rad) {
c[cnt] = (q[i] + q[j]) / 2.0, rad = dis2(q[i] - c[cnt]);
for (k = L; k < j; ++k) if (dis2(q[k] - c[cnt]) > rad)
c[cnt] = work(q[i], q[j], q[k]), rad = dis2(q[i] - c[cnt]);
}
}
} inline bool check(const int &l, const int &st, const int &r) {
static int i;
for (i = st; i <= r; ++i) q[i] = p[i];
random_shuffle(q + st, q + r + );
if (st == l) c[cnt] = q[l], rad = 0.0;
min_cover(l, st, r);
return rad < now_ans + eps;
} inline bool check_ans() {
static int l, len, del;
cnt = l = , del = ;
while (l + del <= n) {
++cnt;
if (cnt > m) return ;
l += del, del = ;
for (len = ; l + len - <= n && check(l, l + (len >> ), l + len - ); len <<= );
del += (len >>= );
for (; len; len >>= )
if (l + del + len - <= n && check(l, l, l + del + len - )) del += len;
}
return ;
} inline void get_ans() {
static int l, len, del;
cnt = l = , del = ;
while (l + del <= n) {
++cnt;
l += del, del = ;
for (len = ; l + len - <= n && check(l, l + (len >> ), l + len - ); len <<= );
del += (len >>= );
for (; len; len >>= )
if (l + del + len - <= n && check(l, l, l + del + len - )) del += len;
check(l, l, l + del - ), ans[cnt] = c[cnt];
}
} int main() {
int i;
LF ansl, ansr, mid;
n = read(), m = read();
for (i = ; i <= n; ++i) p[i].read_in();
ansl = , ansr = inf;
while (ansr - ansl > eps) {
mid = (ansl + ansr) / 2.0;
now_ans = sqr(mid);
if (check_ans()) ansr = mid;
else ansl = mid;
}
now_ans = sqr(ansr);
get_ans();
print(ansr);
printf("\n%d\n", cnt);
for (i = ; i <= cnt; ++i) ans[i].print_out();
return ;
} inline int read() {
static int x, sgn;
static char ch;
x = , sgn = , ch = getchar();
while (ch < '' || '' < ch) {
if (ch == '-') sgn = -;
ch = getchar();
}
while ('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
return sgn * x;
} inline void print(const lf &x) {
static int a, tot, pr[];
static lf t;
if (x < ) putchar('-'), t = -x;
else t = x;
a = (int) t, t -= a, tot = ;
while (a)
pr[++tot] = a % , a /= ;
if (!tot) putchar('');
while (tot) putchar(pr[tot--] + '');
putchar('.');
for (tot = ; tot <= ; ++tot)
t *= , putchar((int) t % + '');
}

(p.s. 数据在这里,求不要像我一样虐萌萌哒main和bz评测姬)

BZOJ2280 [Poi2011]Plot的更多相关文章

  1. BZOJ2280 [Poi2011]Plot 二分+倍增+最小圆覆盖

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2280 https://loj.ac/problem/2159 题解 显然对于一段的 \(q_i ...

  2. 【bzoj2280】[Poi2011]Plot 二分+倍增+二分+最小圆覆盖

    题目描述 给出一系列点p_1, p_2, ... , p_n,将其分成不多余m个连续的段,第i段内求一个点q_i,使得q_i到这段内点的距离的最大值的最大值最小 输入 第一行,n m下面n行,每行两个 ...

  3. [POI2011]Plot

    https://szkopul.edu.pl/problemset/problem/mzrTn1kzVBOAwVYn55LUeAai/site/?key=statement 既卡常又卡精度...真的A ...

  4. POI2011题解

    POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. POI做题笔记

    POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...

  7. matlab画图函数plot()/set/legend

    简单plot()/legend/XY轴范围axis 除了坐标轴信息外还可以添加其它的信息,如所画曲线的信息等:测试代码如下 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); ...

  8. MATLAB的PLOT函数线型设置及横坐标为字符串的代码实例

    2.横坐标为字符串的代码实例 cell={‘PLS’,’SVM’,’RF’,’NNET’,’NB’,’PLR’,’C5.0′,’PDA’,’KNN’,’GLM’,’BCT’};%分类方法yData=[ ...

  9. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

随机推荐

  1. JavaScript算法题之–随机数的生成

    JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2      ...

  2. redis数据库选择-select

    1.关于redis的select命令用法: SELECT index 切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值. 默认使用 0 号数据库. 可用版本: > ...

  3. 你未必知道的css小知识

    1:当按百分比设定一个元素的宽度时,它是相对于父容器的宽度计算的,但是,对于一些表示竖向距离的属性,例如padding-top,padding-bottom,margin-top,margin-bot ...

  4. iOS - NSURLSession 网络请求

    前言 NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) @interface NSURLSession : NSObject @available(iOS ...

  5. iOS - Xib

    前言 xib 文件可以被 Xcode 编译成 nib 文件,xib 文件本质上是一个 xml 文件,而 nib 文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对 ...

  6. 报错Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your database and pytz installed?解决

    在django中的setting.py中: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Shanghai' #'UTC' USE_I18N = True USE ...

  7. JSP连接数据库的两种方式:Jdbc-Odbc桥和Jdbc直连(转)

    学JSP的同学都要知道怎么连数据库,网上的示例各有各的做法,弄得都不知道用谁的好.其实方法千变万化,本质上就两种:Jdbc-Odbc桥和Jdbc直连. 下面先以MySQL为例说说这两种方式各是怎么连的 ...

  8. asp.net 柱形图

    在vs中,如果要使用柱形图,我们大多数使用第三方提供的插件,所以必须要引用样式,这里我使用的是Highcharts-4.1.9插件,百度一下就可以下载到. 关键的js代码: <script sr ...

  9. TortoiseSvn

    TortoiseSVN 是svn版本控制系统的一个免费开源客户端,它是svn版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...

  10. Android网络编程系列 一 TCP/IP协议族之传输层

    这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 传输层中有TCP协议与UDP协议. 1.UDP介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,U ...