博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj5099】[POI2018]Pionek 双指针法
阅读量:5060 次
发布时间:2019-06-12

本文共 1332 字,大约阅读时间需要 4 分钟。

题目描述

给你 $n$ 个平面向量,选出它们中的一部分,使得它们的和的长度最大。求这个最大长度的平方。

输入

第一行包含一个正整数n(n<=200000),表示指令条数。
接下来n行,每行两个整数x,y(|x|,|y|<=10000),表示你可以从(a,b)移动到(a+x,b+y)。

输出

输出一行一个整数,即最大距离的平方。

样例输入

5

2 -2
-2 -2
0 2
3 1
-3 1

样例输出

26


题解

双指针法

一个结论:向量和的长度等于所有向量在其方向上投影的长度和。

因此想要向量和的长度最大,即要选择所有在其方向上投影长度为正的向量。

由于与一个向量夹角在 $(-\frac\pi2,\frac\pi2)$ 范围内的向量在其方向上投影为正,因此所求的就是对于任何一个长度为 $\pi$ 的区间包含的所有向量的和长度的最大值。

对于区间左端点为某个给定向量的,可以通过双指针法来维护向量和。

对于区间左端点不为某个给定向量的,可以在双指针每一步(尾部加向量、头部删向量)后都统计一遍答案。容易发现这样一定是正确的。

时间复杂度为排序的 $O(n\log n)$ 

#include 
#include
#include
using namespace std;typedef long long ll;const double pi = acos(-1);struct data{ ll x , y; double ang; bool operator<(const data &a)const {return ang < a.ang;}}a[400010];int main(){ int n , i , p; ll sx = 0 , sy = 0 , ans = 0; scanf("%d" , &n); for(i = 1 ; i <= n ; i ++ ) scanf("%lld%lld" , &a[i].x , &a[i].y) , a[i].ang = atan2(a[i].y , a[i].x); sort(a + 1 , a + n + 1); for(p = i = 1 ; i <= n ; i ++ ) { while(p < i + n && a[p].ang - a[i].ang < pi) sx += a[p].x , sy += a[p ++ ].y , ans = max(ans , sx * sx + sy * sy); sx -= a[i].x , sy -= a[i].y , ans = max(ans , sx * sx + sy * sy);; a[i + n].x = a[i].x , a[i + n].y = a[i].y , a[i + n].ang = a[i].ang + 2 * pi; } printf("%lld\n" , ans); return 0;}

 

转载于:https://www.cnblogs.com/GXZlegend/p/8110732.html

你可能感兴趣的文章
eggs
查看>>
一步步学习微软InfoPath2010和SP2010--第七章节--从SP列表和业务数据连接接收数据(4)--外部项目选取器和业务数据连接...
查看>>
如何增强你的SharePoint 团队网站首页
查看>>
FZU 1914 Funny Positive Sequence(线性算法)
查看>>
oracle 报错ORA-12514: TNS:listener does not currently know of service requested in connec
查看>>
基于grunt构建的前端集成开发环境
查看>>
MySQL服务读取参数文件my.cnf的规律研究探索
查看>>
java string(转)
查看>>
__all__有趣的属性
查看>>
写博客
查看>>
利用循环播放dataurl的视频来防止锁屏:NoSleep.js
查看>>
python3 生成器与迭代器
查看>>
java编写提升性能的代码
查看>>
ios封装静态库技巧两则
查看>>
Educational Codeforces Round 46 (Rated for Div. 2)
查看>>
Abstract Factory Pattern
查看>>
C# 实现Bresenham算法(vs2010)
查看>>
基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装
查看>>
list 容器 排序函数.xml
查看>>
存储开头结尾使用begin tran,rollback tran作用?
查看>>