[BZOJ5099]Pionek
Description
给 \(n\) (\(n\le 2\times 10 ^5\)) 个向量,现在你在 \((0,0)\) ,选择一些向量使你走的最远。
Solution
自己的想法:按极角排序后双指针 \(l, r\) 扫,若选择 \(r + 1\) 向量走的更远就 r++ ,否则 l++ ,用 \([l,r]\) 的向量和与答案 \(chkmax\)。
这样是错的,虽然答案最后一定是一段连续的区间,但这个并不满足局部最优,所以可能 \(r\) 指针需要舍弃一些不优的右移而到一个更好的位置。
题解首先按极角排序,然后答案一定是某一个半平面,即选一根过原点的x轴,x正半轴的向量都选,也是双指针扫一遍即可。
code
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <fstream>
typedef long long LL;
typedef unsigned long long uLL;
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define MP(x, y) std::make_pair(x, y)
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#define GO cerr << "GO" << endl;
using namespace std;
inline void proc_status()
{
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
template<class T> inline T read()
{
register T x = 0; register int f = 1; register char c;
while (!isdigit(c = getchar())) if (c == '-') f = -1;
while (x = (x << 1) + (x << 3) + (c xor 48), isdigit(c = getchar()));
return x * f;
}
template<typename T> inline bool chkmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
const int maxN = (int) 2e5;
const double PI = acos(-1);
struct Vector
{
int x, y;
double angle;
Vector(int x = 0, int y = 0) : x(x), y(y) { angle = atan2(y, x); }
bool operator < (const Vector& B) const { return angle < B.angle; }
Vector operator + (const Vector& B) const { return Vector(x + B.x, y + B.y); }
Vector operator - (const Vector& B) const { return Vector(x - B.x, y - B.y); }
} ;
int n;
Vector vec[maxN * 2 + 2];
void Input()
{
n = read<int>();
for (int i = 1; i <= n; ++i)
{
int x = read<int>(), y = read<int>();
vec[i] = Vector(x, y);
}
}
void Init()
{
sort(vec + 1, vec + 1 + n);
for (int i = 1; i <= n; ++i) vec[i + n] = vec[i], vec[i + n].angle += 2 * PI;
n <<= 1;
}
LL dis(Vector cur) { return (LL)cur.x * cur.x + (LL)cur.y * cur.y; }
void Solve()
{
LL ans(0);
Vector cur(0, 0);
for (int i = 1, j = 1; j <= n / 2; ++j)
{
while (i < n + j and vec[i].angle - vec[j].angle < PI)
cur = cur + vec[i++], chkmax(ans, dis(cur));
cur = cur - vec[j];
chkmax(ans, dis(cur));
}
printf("%lld\n", ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ5099.in", "r", stdin);
freopen("BZOJ5099.out", "w", stdout);
#endif
Input();
Init();
Solve();
return 0;
}
[BZOJ5099]Pionek的更多相关文章
- 【BZOJ5099】[POI2018]Pionek 几何+双指针
[BZOJ5099][POI2018]Pionek Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表示.每条指令最多只 ...
- bzoj5099: [POI2018]Pionek
Description 在无限大的二维平面的原点(0,0)放置着一个棋子.你有n条可用的移动指令,每条指令可以用一个二维整数向量表 示.每条指令最多只能执行一次,但你可以随意更改它们的执行顺序.棋子可 ...
- 【bzoj5099】[POI2018]Pionek 双指针法
题目描述 给你 $n$ 个平面向量,选出它们中的一部分,使得它们的和的长度最大.求这个最大长度的平方. 输入 第一行包含一个正整数n(n<=200000),表示指令条数. 接下来n行,每行两个整 ...
- bzoj5099 [POI2018]Pionek 双指针
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5099 题解 这道题做法似乎挺单一的. (一开始想了个假做法 向量和的长度等于所有向量在其方向上 ...
- [POI2018]Pionek
[POI2018]Pionek 题目大意: 在无限大的二维平面的原点放置着一个棋子.你有\(n(n\le2\times10^5)\)条可用的移动指令,每条指令可以用一个二维整数向量表示.请你选取若干条 ...
- BZOJ5099 POI2018Pionek
假设确定了最终所得向量的方向,则应该选择所有在该方向上投影为正的向量.按极角序排序后这显然是一段连续区间.最终向量方向很难枚举,但对于某个向量,在其上投影为正的向量与其夹角范围是(-π/2,π/2), ...
- bzoj 5099 [POI2018]Pionek 计算几何 极角排序
[POI2018]Pionek Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 269 Solved: 80[Submit][Status][Disc ...
- bzoj 5099: [POI2018]Pionek
题解: 还是比较简单的一道题 考虑现在有一个向量,当且仅当下一个向量与它夹角<90度这个向量的模长才会增加 接下来怎么做呢 如果我们去枚举初始向量,向量方向会随着新增向量而变化 随着不断顺时针的 ...
- BZOJ 5099: Pionek(双指针)(占位)
pro:有N个向量,你可以选择一些向量,使得其向量和离原点最远. 输出这个欧几里得距离的平方. sol:(感觉网上的证明都不是很充分,我自己也是半信半疑吧)日后证明了再补. #include<b ...
随机推荐
- 生成keystore
Android平台打包发布apk应用,需要使用数字证书(.keystore文件)进行签名,用于表明开发者身份,可以使用JRE环境中的keytool命令生成.以下是windows平台生成证书的方法: 安 ...
- 关于在IOS中 contenteditable=true 无法输入的问题
解决: 1.添加样式-webkit-user-select:text 2.如果引入了fastclick,需要添加个类名 needsclick 来源于知乎(https://www.zhihu.com/q ...
- Spring Boot关于layui的通用返回类
1.关于layui的通用返回类 code.count.data.msg public class Msg { private long code = 0; private long count = 0 ...
- 文本检错——中文拼写检查工具FASPell
最近因为相关项目需要考虑中文文本检错,然后就发现了爱奇艺发布的号称SOTA的FASPell已经开源代码,所以开始着手实现. 检错思想两步:一,掩码语言模型(MLM)产生候选字符:二,CSD过滤候选字符 ...
- 进度对话框QProgressDialog
继承于 QDialog import sys,time from PyQt5.QtWidgets import QApplication, QWidget,QPushButton,QProgress ...
- Java_环境变量
介绍 第一步:下载JDK 第二步:搭建环境,双击JDK安装程序 第三步:配置环境变量 第四步:检查JDK安装是否成功 介绍: .java 源文件 我们所编写的代码都在这个文件中 .class 字节码文 ...
- vue引入css和js的方法
1.引入js的话 require('地址') imgport xxx from ‘src’ import xxx 2.引入css @import ‘ ’
- 内存泄露问题改进(转自vczh)
参考:http://www.cppblog.com/vczh/archive/2010/06/22/118493.html 参考:https://www.cnblogs.com/skynet/arch ...
- websocket 传输数据帧打包 (client端)
/* Vertion: 0.2.1 date: 2015.8.11 content: gcc 编译通过 */ //websocket 传输数据帧打包 client端 //参数:src 为输入字符串 / ...
- Dancing Stars on Me
Dancing Stars on Me Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...