HDU 6538 Neko and quadrilateral(极角排序+旋转坐标系)
这道题简直太好了,对于计算几何选手需要掌握的一个方法。
首先对于求解四边形面积,我们可以将四边形按对角线划分成两个三角形,显然此时四边形的面积最大最小值就变成了求解里这个对角线最近最远的点对。
对于此类问题有一个技巧,首先我们将点按照x为第一关键词y为第二关键词从小到大排序,然后我们开始取向量,并将所取的所有向量进行极角排序(斜率排序,叉积排序均可)。然后我们可以证明,第一条向量的两个端点在之前排序过的点的序列中是相邻的,如果这两个不是相邻的,说明中间存在一点并且满足中间的点的x大于左端点小于右端点,此时我们可以画图得知,这样会形成一条斜率更小的直线,与之前矛盾,所以这两个端点在原序列中必然相邻。接下来还有一个神奇的地方,这样的序列保证在序列的第一个点到向量的左端点的点距离这条直线单调递减,右侧亦如此,如果存在一个点比前一个点的距离要远,而这个点x大于前一个点的x,那么我们画图可知,这两点的斜率比当前斜率要小,则矛盾,以此证明出这样排序后的两条性质,那么我们考虑当我们旋转坐标系的时候,画图可知,受影响的点只有之前那条向量上的点,而且根据之前矛盾关系,之前那条的斜率大于现在这条,那么之前那条的两端点到这条线上的距离一个小一个大,那么我们只需要更换这两个点在序列中的位置,即可满足之前的单调性,所以每次旋转坐标系只需要交换上一条的向量两端点在排序后的序列中的位置即可,这样我们就维护出了距离对角线最远和最近的点,那么求解最大最小四边形面积也可以得出,当然也可以用此方法求得最大最小三角形面积,之前codeforce上有一题就是给定面积,去寻找是否存在三角形满足面积等于给定值,那么我们便可以用这个单调性以此基础上进行二分查找,所以此类方法复杂度为n2logn。
但是仅对于求解最大四边形三角形面积,还有一个更优的策略,我们可以得出,四边形上的四个点一定在凸包上,那么对于此类问题,我们便可以用旋转卡壳进行枚举,枚举每一条对角边,再用两个点去旋转,维护三角形最大值即可,对于三角形而言,三个端点仍然在凸包上,那么我们只需要固定一个点,旋转下两个端点即可,每次移动到该顶点处的三角形面最大位置即可,更新答案,此类方法复杂度nlogn
1 // ——By DD_BOND
2
3 //#include<bits/stdc++.h>
4 #include<functional>
5 #include<algorithm>
6 #include<iostream>
7 #include<sstream>
8 #include<iomanip>
9 #include<climits>
10 #include<cstring>
11 #include<cstdlib>
12 #include<cstddef>
13 #include<cstdio>
14 #include<memory>
15 #include<vector>
16 #include<cctype>
17 #include<string>
18 #include<cmath>
19 #include<queue>
20 #include<deque>
21 #include<ctime>
22 #include<stack>
23 #include<map>
24 #include<set>
25
26 #define fi first
27 #define se second
28 #define MP make_pair
29 #define pb push_back
30 #define INF 0x3f3f3f3f
31 #define pi 3.1415926535898
32 #define lowbit(a) (a&(-a))
33 #define lson l,(l+r)/2,rt<<1
34 #define rson (l+r)/2+1,r,rt<<1|1
35 #define Min(a,b,c) min(a,min(b,c))
36 #define Max(a,b,c) max(a,max(b,c))
37 #define debug(x) cerr<<#x<<"="<<x<<"\n";
38
39 using namespace std;
40
41 typedef long long ll;
42 typedef pair<int,int> P;
43 typedef pair<ll,ll> Pll;
44 typedef unsigned long long ull;
45
46 const ll LLMAX=2e18;
47 const int MOD=1e9+7;
48 const double eps=1e-12;
49 const int MAXN=1e6+10;
50 const int hmod1=0x48E2DCE7;
51 const int hmod2=0x60000005;
52
53 inline ll sqr(ll x){ return x*x; }
54 inline int sqr(int x){ return x*x; }
55 inline double sqr(double x){ return x*x; }
56 ll __gcd(ll a,ll b){ return b==0? a: __gcd(b,a%b); }
57 ll qpow(ll a,ll n){ll sum=1;while(n){if(n&1)sum=sum*a%MOD;a=a*a%MOD;n>>=1;}return sum;}
58 inline ll dcmp(ll x){ if(fabs(x)<eps) return 0; return (x>0? 1: -1); }
59
60 int p[2010];
61
62 struct Point{
63 int x,y,i,j;
64 Point(){ x=y=0; }
65 Point(int a,int b){ x=a,y=b; }
66 Point(int a,int b,Point p){ i=a,j=b,x=p.x,y=p.y; }
67 Point operator -(const Point &n)const{ return Point(x-n.x,y-n.y); }
68 bool operator <(const Point&n)const{ return x==n.x? y<n.y: x<n.x; }
69 void output(){ cout<<x<<' '<<y<<endl; }
70 }point[2010],vec[2*MAXN];
71
72 ll cross(Point a,Point b){ return 1ll*a.x*b.y-1ll*a.y*b.x; }
73
74 ll check(int i,int j,int k){ return abs(cross(point[j]-point[i],point[k]-point[i])); }
75
76 int main(void)
77 {
78 ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
79 ll n;
80 while(cin>>n){
81 ll s1=9e18,s2=0,cnt=0;
82 for(int i=0;i<n;i++) cin>>point[i].x>>point[i].y,p[i]=i;
83 if(n<4) return cout<<0<<' '<<0<<endl,0;
84 sort(point,point+n);
85 for(int i=0;i<n;i++)
86 for(int j=i+1;j<n;j++)
87 vec[cnt++]=Point(i,j,point[j]-point[i]);
88 sort(vec,vec+cnt,[](Point a,Point b){ return cross(a,b)>0; });
89 for(int i=0;i<cnt;i++){
90 int a=vec[i].i,b=vec[i].j;
91 if(p[a]>p[b]) swap(a,b);
92 if(p[a]!=0&&p[b]!=n-1) s2=max(s2,check(p[a],p[b],0)+check(p[a],p[b],n-1));
93 if(p[a]!=0&&p[b]!=n-1) s1=min(s1,check(p[a],p[b],p[a]-1)+check(p[a],p[b],p[b]+1));
94 swap(p[a],p[b]); swap(point[p[a]],point[p[b]]);
95 }
96 cout<<s1<<' '<<s2<<endl;
97 }
98 return 0;
99 }
HDU 6538 Neko and quadrilateral(极角排序+旋转坐标系)的更多相关文章
- 2017ACM暑期多校联合训练 - Team 7 1008 HDU 6127 Hard challenge (极角排序)
题目链接 Problem Description There are n points on the plane, and the ith points has a value vali, and i ...
- HDU 5738 Eureka(极角排序)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5738 [题目大意] 给出平面中一些点,在同一直线的点可以划分为一个集合,问可以组成多少包含元素不少 ...
- 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge
acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...
- HDU Always Cook Mushroom (极角排序+树状数组)
Problem Description Matt has a company, Always Cook Mushroom (ACM), which produces high-quality mush ...
- hdu 5738 Eureka 极角排序+组合数学
Eureka Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- POJ 2280 Amphiphilic Carbon Molecules 极角排序 + 扫描线
从TLE的暴力枚举 到 13313MS的扫描线 再到 1297MS的简化后的扫描线,简直感觉要爽翻啦.然后满怀欣喜的去HDU交了一下,直接又回到了TLE.....泪流满面 虽说HDU的时限是2000 ...
- poj2280Amphiphilic Carbon Molecules(极角排序)
链接 卡了几天的破题,对于hdu的那份数据,这就一神题.. 借助极角排序,枚举以每一个点进行极角排序,然后构造两条扫描线,一个上面一个下面,两条同时走,把上线和下线的点以及上线左边的点分别统计出来,如 ...
- 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)
Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...
- UVa 1606 (极角排序) Amphiphilic Carbon Molecules
如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...
随机推荐
- flask基础之一
flask基础之一 hello world #从flask这个包中导入Flask这个类 #Flask这个类是项目的核心,以后的很多操作都是基于这个类的对象 #注册url,注册蓝图都是这个类的对象 fr ...
- wepy-开发总结(功能点)
开发小程序中,遇到的wepy的几点坑,记录一下; 更详细的项目总结记录请见我的个人博客:https://fanghongliang.github.io/ 1.定时器: 在页面中有需要用到倒计时或者其他 ...
- layui 表格设置td的宽度
layui 表格设置td的宽度, td{ min-width: 150px; max-width: 200px; } 超出长度隐藏 overflow: hidden; text-overflow: e ...
- nuxt.js axios使用poxyTable代理,解决跨域问题
1 安装(@gauseen/nuxt-proxy) cnpm install @gauseen/nuxt-proxy --save 2 配置nuxt.config.js modules: [ // 请 ...
- Bugku 杂项 眼见非实(ISCCCTF)
眼见非实(ISCCCTF) 下载文件后,用winhex打开 发现文件头为50 4B 03 04说明是一个压缩文件,还可以看到其中有.docx文件 更改文件后缀为 .zip 解压后发现 这个文件用wor ...
- NOI 2727:仙岛求药 x
总时间限制: 1000ms 内存限制: 65536kB 描述 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发 ...
- 爬虫小例1:ajax形式的网页数据的抓取
---恢复内容开始--- 下面记录如何抓取ajax形式加载的网页数据: 目标:获取“https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%8 ...
- iOS-Swizzle
最后更新:2017-06-21 一.先说结论 void swizzleMethod(Class cls, SEL originalSelector, SEL swizzledSelector) { M ...
- JPA Hibernate 等面向对象持久化框架难以解决的问题
1+N查询性能问题 单个更新实体对象,而不是使用单调语句 在Java端做了很重的数据处理,数据库端反而很少 多层次 fetch inner join 难以实现 关联映射难以自定义条件 级联操作难以掌控 ...
- [CSP-S模拟测试]:小P的单调数列(树状数组+DP)
题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...