BZOJ2280 [Poi2011]Plot
恩。。这题真是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的更多相关文章
- BZOJ2280 [Poi2011]Plot 二分+倍增+最小圆覆盖
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2280 https://loj.ac/problem/2159 题解 显然对于一段的 \(q_i ...
- 【bzoj2280】[Poi2011]Plot 二分+倍增+二分+最小圆覆盖
题目描述 给出一系列点p_1, p_2, ... , p_n,将其分成不多余m个连续的段,第i段内求一个点q_i,使得q_i到这段内点的距离的最大值的最大值最小 输入 第一行,n m下面n行,每行两个 ...
- [POI2011]Plot
https://szkopul.edu.pl/problemset/problem/mzrTn1kzVBOAwVYn55LUeAai/site/?key=statement 既卡常又卡精度...真的A ...
- POI2011题解
POI2011题解 2214先咕一会... [BZOJ2212][POI2011]Tree Rotations 线段树合并模板题. #include<cstdio> #include< ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- POI做题笔记
POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...
- matlab画图函数plot()/set/legend
简单plot()/legend/XY轴范围axis 除了坐标轴信息外还可以添加其它的信息,如所画曲线的信息等:测试代码如下 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); ...
- MATLAB的PLOT函数线型设置及横坐标为字符串的代码实例
2.横坐标为字符串的代码实例 cell={‘PLS’,’SVM’,’RF’,’NNET’,’NB’,’PLR’,’C5.0′,’PDA’,’KNN’,’GLM’,’BCT’};%分类方法yData=[ ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
随机推荐
- monkeyrunner自动登录脚本
自己写了个平时测试的app的自动登录脚本,亲测可运行.读者参照时只需要改包名.activity名称.坐标值.账号和密码即可 查看坐标是多少的方法:使用手机的指针位置来实现:系统设置---开发者选项-- ...
- DICOM标准相关资料
由于需要阅读影像,对DICOM需要先熟悉起来.关于DICOM,找了一些资料,可以学习.如下: DICOM标准:http://dicom.nema.org/standard.html 中文 DICOM ...
- C#线程系列讲座(5):同步技术之Monitor
在上一讲介绍了使用lock来实现线程之间的同步.实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类.先看看下面的C#源代码: public sta ...
- ACCESS 数据库使用配置调整解决方案
分享到 一键分享 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 64位服务器无法使用ac ...
- iOS - OC RunTime 运行时
1.运行时的使用 向分类中添加属性 // 包含运行时头文件 #import <objc/runtime.h> /* void objc_setAssociatedObject(id obj ...
- 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)
问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...
- 关于Java控制台输入输出乱码问题
产生原因:因为这个开源项目的默认字符编码为UTF-8,所以我的控制台的字符编码也自动变成了UTF-8,而键盘的输入流的默认格式是GBK格式,这样就造成了在GBK转UTF-8的过程中产生的奇数乱码错误( ...
- [转载] DevOps年中盘点:国外最受欢迎的10篇技术文章
本文根据高效运维系列微信群的群友投稿整理而成.“高效运维”公众号作为本系列群的官方唯一公众号,原创并独家首发. 欢迎关注“高效运维”公众号,以免费参加「运维讲坛」每月一次的线下交流活动:并抢先赏阅干货 ...
- [转载] zookeeper faq
Zookeeper FAQ1. 如何处理CONNECTION_LOSS?在Zookeeper中,服务器和客户端之间维持一个长连接,CONNECTION_LOSS意味着这个连接断开了.客户端API返回C ...
- mysql 变量
用户变量 1.用户变量,用户变量和数据库连接有关,连接后声明变量,连接断开后,自动消失. 2.用户变量以@开头,select一个没有赋值的用户变量,返回NULL,也就是没有值,注意取值为NULL与取值 ...