BZOJ3707 圈地
只会O(n ^ 3)路过= =
OrzOrzOrzOrzOrz
"出题人题解:
显然,这时候暴力枚举会T。于是我们转变一下思路,如果我们确定了2个点以后,第三个点有必要去盲目的枚举吗?答案是否定的。实际上我们把经过这两点的线看成一个斜率,把他当成y轴你会发现第三个点明显是在坐标系左右找一个离”y轴”最近的点来算面积更新答案。然后我们可以继续思考,发现我们可以把点按照某个斜率当成”y轴”进行“从左到右”的排序,这样当2点共线的时候,用这两个点的左右2个点去更新答案就好了。也就是说我们采用旋转坐标系的方法,一开始按x坐标排好序,认为直接用竖着的那条斜率,然后维护的话每次其实当两点共线后只要交换他们就能得到斜率转过该事件点的序列。所以我们可以预处理出所有可行的斜率,当成事件点,不断转动坐标系更新答案就好。这样复杂度只有n^2,期望得分100.(这确实只是个暴力的优化 啊。。。不要砸我T_T)"
/**************************************************************
Problem: 3707
User: rausen
Language: C++
Result: Accepted
Time:576 ms
Memory:16616 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <algorithm> using namespace std;
typedef double lf;
const int N = ;
const int M = N * N; struct points {
lf x, y;
points() {}
points(lf _x, lf _y) : x(_x), y(_y) {}
}p[N];
inline bool operator < (const points &a, const points &b) {
return a.x < b.x;
} inline points operator - (const points &a, const points &b) {
return points(a.x - b.x, a.y - b.y);
} inline lf operator & (const points &a, const points &b) {
return a.x * b.y - a.y * b.x;
} struct lines {
int p1, p2;
lf S;
lines() {}
lines(int _p1, int _p2, lf _S) : p1(_p1), p2(_p2), S(_S) {}
}l[M];
inline bool operator < (const lines &a, const lines &b) {
return a.S < b.S;
} int n, tot;
int w[N], a[N];
lf ans = 1e60; inline int read() {
int x = , sgn = ;
char ch = getchar();
while (ch < '' || '' < ch) {
if (ch == '-') sgn = -;
ch = getchar();
}
while ('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
return sgn * x;
} inline void calc(int i, int j, int k) {
ans = min(ans, fabs((p[i] - p[k]) & (p[j] - p[k])) / );
} int main() {
int i, j, p1, p2;
n = read();
for (i = ; i <= n; ++i)
p[i].x = read(), p[i].y = read();
sort(p + , p + n + );
for (i = ; i <= n; ++i)
a[i] = w[i] = i;
for (i = ; i <= n; ++i)
for (j = i + ; j <= n; ++j)
l[++tot] = lines(i, j, (p[j].y - p[i].y) / (p[j].x - p[i].x));
sort(l + , l + tot + );
for (i = ; i <= tot; ++i) {
p1 = l[i].p1, p2 = l[i].p2;
if (w[p1] > w[p2]) swap(p1, p2);
if (w[p1] > ) calc(a[w[p1] - ], p1, p2);
if (w[p2] < n) calc(a[w[p2] + ], p1, p2);
swap(w[p1], w[p2]);
swap(a[w[p1]], a[w[p2]]);
}
printf("%.2lf\n", ans);
return ;
}
(p.s. 话说那些Rank前4是怎么做到的= =内存和时间都很小的说Orz)
BZOJ3707 圈地的更多相关文章
- CodeForces - 1019D(BZOJ3707圈地):Large Triangle (几何,找面积为S的三角形)
		
题意:给定平面上N个点,问是否存在三角形,其面积为S. 思路:选择Y轴,枚举这个Y轴,面积大小只与|y-Y|有关,然后二分,具体的可以先去做BZOJ3707. 具体的: 1,先对点排序,X坐标为第一关 ...
 - 【BZOJ3707】圈地 几何
		
[BZOJ3707]圈地 Description 2维平面上有n个木桩,黄学长有一次圈地的机会并得到圈到的土地,为了体现他的高风亮节,他要使他圈到的土地面积尽量小.圈地需要圈一个至少3个点的多边形,多 ...
 - QQ空间/朋友圈类界面的搭建
		
类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...
 - Python微信-- 分享接口(分享到朋友圈、朋友、空间)
		
生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...
 - BJITJobs : 北京IT圈高端职位招聘信息,成功率最高的高端求职渠道
		
你有实力,但比你差的人都升了,你的师弟都年薪50万了,你还是找不到机会.为什么你离高端机会总是差一步呢?其实你离成功就差一次机会,一个适合你的高端职位的信息! 招聘网站不靠谱:三大网站都是低端职位为主 ...
 - WPF 自定义绕圈进度条
		
在设计界面时,有时会遇到进度条,本次讲解如何设计自定义的绕圈进度条,直接上代码: 1.控件界面 <UserControl x:Class="ProgressBarControl&quo ...
 - Apple Watch版微信来了 收发微信刷朋友圈不在话下
		
昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...
 - UC浏览器 分享到朋友圈和微信好友                                                    分类:            JavaScript             2015-04-28 14:45    615人阅读    评论(1)    收藏
		
用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...
 - nyist 78 圈水池
		
http://acm.nyist.net/JudgeOnline/problem.php?pid=78 圈水池 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一个 ...
 
随机推荐
- formset批量处理form表单数据
			
Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据 class StudentStudyRecordModel( ...
 - android 异步线程刷新UI 以及 JSON解析 以及 url get请求
			
import android.os.Handler; import android.os.Message; 1. Handler mHandler = new Handler() { @Overrid ...
 - MySQL 储存过程-原理、语法、函数详细说明
			
Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...
 - 整数(质因子)分解(Pollard rho大整数分解)
			
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
 - sdut AOE网上的关键路径(spfa+前向星)
			
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2498&cid=1304 题目描述 一个无环的有向图称为无环图(Directed Acyc ...
 - 5.7 Components — Sending Actions From Components to Your Application
			
一.概述 1. 当一个组件在模板中被使用时,它具有发送action到这个模板的controller和routes的能力.当重大事件发生的时候,这些允许组件通知application,比如点击组件一个特 ...
 - 禁止或强制使用堆分配---《C++必知必会》 条款34
			
有时候,指明一些特定类的对象不应该被分配到堆(heap)上是个好主意.通常这是为了确保该对象的析构函数一定会得到调用.维护对象本身(body object)的引用计数的句柄对象(handle obje ...
 - POJ 1062 昂贵的聘礼(最短路)题解
			
题意:中文题意不解释... 思路:交换物品使得费用最小,很明显的最短路,边的权值就是优惠的价格,可以直接用Dijkstra解决.但是题目中要求最短路路径中任意两个等级不能超过m,我们不能在连最短路的时 ...
 - 如何在官网下载JDK(版本、系统类型、字节位等)
			
JDK官网地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 步骤1: 此步注意不要下载运行时jre
 - Asynchronous Programming Model (APM)异步编程模型
			
https://msdn.microsoft.com/zh-cn/library/ms228963(v=vs.110).aspx 一.概念 An asynchronous operation that ...