[POI2018]Pionek

题目大意:

在无限大的二维平面的原点放置着一个棋子。你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示。请你选取若干条指令,使得经过这些操作后,棋子离原点的距离最大。

思路:

将所有向量极角排序,然后你选取的向量一定是里面连续的一段,由于所有向量排成一个环,所以要复制一遍接在后面,最后用尺取法枚举左右端点即可。

时间复杂度\(\mathcal O(n\log n)\)。

源代码:

#include<cmath>
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
typedef long long int64;
const int N=4e5+2;
struct Point {
int64 x,y;
double a;
bool operator < (const Point &rhs) const {
return a<rhs.a;
}
Point operator + (const Point &rhs) const {
return (Point){x+rhs.x,y+rhs.y,a+rhs.a};
}
};
Point p[N],sum[N];
inline int64 sqr(const int64 &x) {
return x*x;
}
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) {
p[i].x=getint();
p[i].y=getint();
p[i].a=atan2(p[i].x,p[i].y);
}
std::sort(&p[1],&p[n]+1);
std::copy(&p[1],&p[n]+1,&p[n+1]);
for(register int i=n+1;i<=n*2;i++) {
p[i].a+=M_PI*2;
}
int64 ans=0;
sum[n*2].a=1e8;
for(register int i=1,j=1;j<=n*2;j++) {
sum[j]=sum[j-1]+p[j];
for(;i<=j&&p[j+1].a-p[i].a>=M_PI;i++) {
ans=std::max(ans,sqr(sum[j].x-sum[i-1].x)+sqr(sum[j].y-sum[i-1].y));
}
if(i<=j) ans=std::max(ans,sqr(sum[j].x-sum[i-1].x)+sqr(sum[j].y-sum[i-1].y));
}
printf("%lld\n",ans);
return 0;
}

[POI2018]Pionek的更多相关文章

  1. 【BZOJ5099】[POI2018]Pionek 几何+双指针

    [BZOJ5099][POI2018]Pionek Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表示.每条指令最多只 ...

  2. bzoj 5099 [POI2018]Pionek 计算几何 极角排序

    [POI2018]Pionek Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 269  Solved: 80[Submit][Status][Disc ...

  3. bzoj 5099: [POI2018]Pionek

    题解: 还是比较简单的一道题 考虑现在有一个向量,当且仅当下一个向量与它夹角<90度这个向量的模长才会增加 接下来怎么做呢 如果我们去枚举初始向量,向量方向会随着新增向量而变化 随着不断顺时针的 ...

  4. bzoj5099: [POI2018]Pionek

    Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表 示.每条指令最多只能执行一次,但你可以随意更改它们的执行顺序.棋子可 ...

  5. 【bzoj5099】[POI2018]Pionek 双指针法

    题目描述 给你 $n$ 个平面向量,选出它们中的一部分,使得它们的和的长度最大.求这个最大长度的平方. 输入 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整 ...

  6. bzoj5099 [POI2018]Pionek 双指针

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5099 题解 这道题做法似乎挺单一的. (一开始想了个假做法 向量和的长度等于所有向量在其方向上 ...

  7. POI2018

    [BZOJ5099][POI2018]Pionek(极角排序+two pointers) 几个不会严谨证明的结论: 1.将所有向量按极角排序,则答案集合一定是连续的一段. 当答案方向确定时,则一个向量 ...

  8. bzoj5100 [POI2018]Plan metra 构造

    5100: [POI2018]Plan metra Time Limit: 40 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 189  Sol ...

  9. bzoj千题计划249:bzoj5100: [POI2018]Plan metra

    http://www.lydsy.com/JudgeOnline/problem.php?id=5100 1.找到d1[i]+dn[i] 最小的点,作为1到n链上的点 2.令链长为D,若abs(d1[ ...

随机推荐

  1. Linux系统编程【转】

    转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...

  2. TCP建立流程 【转】

    解决TCP连接数过多的问题 TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题 TCP状态迁移 大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基 ...

  3. [ VB ] OrElse, AndAlso [ C# ] ||, && 运算符

    条件演算子も当然のように C# と VB では記述方法が異なる.比較すると下表のようになる. VB              C#OrElse        ||AndAlso     &&a ...

  4. Android用户界面开发:Fragment

    Android用户界面开发:Fragment 1:注意事项  3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包.  3.0 ...

  5. IDEA测试结果查看

    点击漏斗图标切换查看测试日志信息,点击,导出测试报告

  6. DNS详解: A记录,子域名,CNAME别名,PTR,MX,TXT,SRV,TTL

    DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务).域名系统为Internet上的主机分配域名地址和IP地址.由于网络中的计算机都必 ...

  7. matplotlib画图

    matplotlib画图 import numpy as np import matplotlib.pyplot as plt x1=[20,33,51,79,101,121,132,145,162, ...

  8. Office系列版本安装包下载

    链接:http://pan.baidu.com/s/1i4UFZOp  密码:f9y8 链接:http://pan.baidu.com/s/1i4YJN4D 密码:743q 链接:http://pan ...

  9. python 全栈开发,Day101(redis操作,购物车,DRF解析器)

    昨日内容回顾 1. django请求生命周期? - 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者po ...

  10. easyx的基础应用教程

    引用 什么是 EasyX? 作者:EasyX EasyX 是针对 C++ 的图形库,可以帮助 C 语言初学者快速上手图形和游戏编程. 比如,可以用 VC + EasyX 很快的用几何图形画一个房子,或 ...