[几何 two-pointers] BZOJ 1278 向量vector
来源:互联网 发布:穿淘宝爆款 编辑:程序博客网 时间:2024/09/21 08:52
有一个结论就是组成答案的向量一定都在某一直线的一侧
证明:以答案向量作一个圆 这条直线就是过终点的切线
#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;typedef long long ld;struct PP{ ld x,y; double ang; PP(ld x=0,ld y=0):x(x),y(y) { } friend PP operator + (PP A,PP B){ return PP(A.x+B.x,A.y+B.y); } friend PP operator - (PP A,PP B){ return PP(A.x-B.x,A.y-B.y); } friend ld operator * (PP A,PP B){ return A.x*B.y-B.x*A.y; } void Ang() { ang=atan2(y,x); } bool operator < (const PP &B) const{ return ang<B.ang; } ld M(){ return x*x+y*y; }};const int N=200005;int n;PP p[N],sum[N];ld Ans=0;int main(){ freopen("t.in","r",stdin); freopen("t.out","w",stdout); scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y),p[i].Ang(); sort(p+1,p+n+1); for (int i=1;i<=n;i++) p[n+i]=p[i]; for (int i=1;i<=(n<<1);i++) sum[i]=sum[i-1]+p[i]; int l=1,r=1; Ans=max(Ans,(sum[r]-sum[l-1]).M()); while (r+1<=l+n-1 && p[l]*p[r+1]>=0) r++,Ans=max(Ans,(sum[r]-sum[l-1]).M()); Ans=max(Ans,(sum[r]-sum[l-1]).M()); while (l+1<=n){ l++; Ans=max(Ans,(sum[r]-sum[l-1]).M()); while (r+1<=l+n-1 && p[l]*p[r+1]>=0) r++,Ans=max(Ans,(sum[r]-sum[l-1]).M()); Ans=max(Ans,(sum[r]-sum[l-1]).M()); } printf("%lld.000\n",Ans); return 0;}
0 0
- [几何 two-pointers] BZOJ 1278 向量vector
- [DP two-pointers 杂题] BZOJ 4828 [Hnoi2017]大佬
- Two Pointers
- Two pointers
- Two pointers
- 向量几何
- 向量 VECTOR
- 向量Vector
- 向量vector
- 向量-Vector
- Poj 3320(two pointers)
- Poj 2566(two pointers)
- Sum( two pointers )
- Array Two Pointers 总结
- HDU-5289<two pointers>
- hdu5806 two-pointers
- Odd Palindromes Two Pointers
- LeetCode--Two Pointers
- Codeforces Round #352 (Div. 1) B. Robin Hood
- qt获取IP、网关地址
- sql where 1=1和 0=1 的作用
- 剑指offer 链表专题(一)
- java web项目中前端调试技巧
- [几何 two-pointers] BZOJ 1278 向量vector
- Java之Foreach语句
- 很随意的跑马灯
- 判断一个数是否为素数的方法汇总
- EL表达式 (详解)
- 延时函数
- 对C语言的认识
- Java项目经验——软件工程师成长的关键
- 数据配合使用过滤器orderBy过滤数据