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 ...
随机推荐
- table布局注意点
1.同行等高. 2.宽度自动调节(table-layout:fixed;). 3.处理垂直居中又是神器 参考链接: http://www.blueidea.com/tech/web/2008/6257 ...
- lazyload懒加载的使用
1.引用<script src="http://a.tbcdn.cn/apps/baron/js/??lib/tmm/tmm.js,lib/lazyload/lazyload.js?2 ...
- php 上传文件。$_FILES
<form name="article" method="post" enctype="multipart/form-data" ac ...
- iOS - Swift NSEnumerator 迭代器
前言 public class NSEnumerator : NSObject, NSFastEnumeration 1.迭代器 let arr:NSArray = ["bei", ...
- Object Pascal 运算符
Object Pascal 的运算符 运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符.逻辑运算符.比较运算符和按位运算符. 1.算术运算符Object Pascal ...
- hdu 4870 Rating
题目链接:hdu 4870 这题应该算是概率 dp 吧,刚开始看了好几个博客都一头雾水,总有些细节理不清楚,后来看了 hdu 4870 Rating (概率dp) 这篇博客终于有如醍醐灌顶,就好像是第 ...
- Selected SVN connector library is not available or cannot be loaded
1.错误描述 The following data will be sent: ------ STATUS ------ pluginId org.eclipse.team.sv ...
- spring-mvc 与 openid4java
以GoogleOpenID 为例,试验了OAuth单点登录的用法: <dependency> <groupId>org.openid4java</groupId> ...
- DB2数据库中SQL语句中使用or和and的关键字的时候注意事项
--正确的SQL语句,查询结果:746 ) FROM EHR_BASE EB, EHR_HF_INDICATOR EHI WHERE EB.EHR_ID=EHI.EHR_ID ' ' ' AND EB ...
- iOS开发 设置状态栏样式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:NO];