恩。。这题真是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. 学习python得到方向与主体

    Python的主体内容大致可以分为以下几个部分: 面向过程.包括基本的表达式,if语句,循环,函数等.如果你有任何一个语言的基础,特别是C语言的基础,这一部分就是分分钟了解下Python规定的事.如果 ...

  2. 创建XML

    //创建XML XElement xelement = new XElement("request", new XElement("head", new XEl ...

  3. FlexSlider插件的详细设置参数 http://www.woothemes.com/flexslider/ -----幻灯片插件

    $(window).load(function() { $('.flexslider').flexslider({ namespace: 'flex-', //控件的命名空间,会影响样式前缀 anim ...

  4. 利用JDK的中Proxy动态代理实现Spring的AOP技术

    首先给出设计模式静态代理与动态代理的学习: http://layznet.iteye.com/blog/1182924   讲的不错 然后我们实现AOP 就要求我们对委托的所有方法的调用实现拦截 代理 ...

  5. BeanUtils框架的简单运用

    Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单.易用的API操作Bean的属性——BeanUtils Beanutils工具包的常用类: •BeanUt ...

  6. ZOJ-2366 Weird Dissimilarity 动态规划+贪心

    题意:现给定一个字符集中一共Z个元素的环境,给出一个Z*Z的数组,表示从i到j之间的距离.给定两组字符串,分别问包含着两个字符串(给定的字符串为所求字符串的子序列不是子串)对应位的距离和值最小为多少? ...

  7. poj2986A Triangle and a Circle&&poj3675Telescope(三角形剖分)

    链接 2986是3675的简化版,只有一个三角形. 这题主要在于求剖分后三角形与圆的相交面积,需要分情况讨论. 具体可以看此博客 http://hi.baidu.com/billdu/item/703 ...

  8. Linux之top命令

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是一个动态显示过程,即可以通过用户按键来不断刷新 ...

  9. 代码中特殊的注释技术——TODO、FIXME和XXX的用处

    本文内容概要: 代码中特殊的注释技术--TODO.FIXME和XXX的用处. 前言:今天在阅读Qt  Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上, ...

  10. 详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法

    详细地jsoncpp编译方法 和 vs2010中导入第三方库的方法 一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src- ...